Linq to Entities中的自定义联合

3

我需要在两个id上联合这些行,但不能使用IEqualityComparer,因为这些不支持LINQ to Entities。

result中,我需要每个唯一的BizIdBazId组合,如果id对来自foos,则将使用该值,否则该值应为零。这是一个大大简化的示例,在现实中,这些表非常大,这些操作无法在内存中完成。因此,这个查询需要使用LINQ to Entities工作,以便将其转换为有效的SQL并在数据库上执行。我怀疑这可以通过某些wherejoinDefaultIfEmpty()的组合来完成,而不是UnionDistinct(),但我现在不知道怎么做。

var foos = from f in Context.Foos where f.isActive select new { BizId = f.bizId, BazId = f.BazId, Value = f.Value };
var bars = from b in Context.Bars where b.isEnabled select new { BizId = b.bizId, BazId = b.BazId, Value = 0 };
var result = foos.Union(bars).Distinct(); //I need this to compare only BizId and BazId
1个回答

2
你可以按照两个字段进行分组,然后获取每个组的第一个项目:
foos.Union(bars).GroupBy(x => new { x.bizId, x.bazId })
    .Select(g => g.FirstOrDefault())

可以假设foos总是在列表中排在第一位吗?还是需要进行检查?我认为这个会起作用! - Kevin Brey
如果你想让特定的项目排在最前面,你应该添加 g.OrderBy(x => x....).FirstOrDefault() - Gert Arnold
根据问题,如果存在该值,则需要该值。为了获得它,我稍微修改了您的查询:foos.Union(bars).GroupBy(x => new { x.bizId, x.bazId }).Select(g => g.OrderByDescending(x => x.Allocation).FirstOrDefault())。非常感谢! - Kevin Brey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接