Linq to Entities 中的自定义联盟

Custom Union in Linq to Entities

我需要在不使用 IEqualityComparer 的情况下将这些行合并到两个 ID 上,因为 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

您可以按两个字段分组,然后获取每组的第一项:

foos.Union(bars).GroupBy(x => new { x.bizId, x.bazId })
    .Select(g => g.FirstOrDefault())