Linq to Entities 中的自定义联盟
Custom Union in Linq to Entities
我需要在不使用 IEqualityComparer
的情况下将这些行合并到两个 ID 上,因为 LINQ to Entities 不支持这些行。
在 result
中,我需要 BizId
和 BazId
的每个唯一组合,如果 id 对来自那里,则值来自 foos
,否则值应该为零。这是一个大大简化的示例,实际上这些表非常大,无法在内存中完成这些操作。因此,此查询 需要与 LINQ to Entities 一起使用,以便它可以转换为有效 SQL 并在数据库上执行。我怀疑这可以通过 where
、join
和 DefaultIfEmpty()
的某种组合而不是 Union
和 Distinct()
来完成,但我现在不知所措.
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())
我需要在不使用 IEqualityComparer
的情况下将这些行合并到两个 ID 上,因为 LINQ to Entities 不支持这些行。
在 result
中,我需要 BizId
和 BazId
的每个唯一组合,如果 id 对来自那里,则值来自 foos
,否则值应该为零。这是一个大大简化的示例,实际上这些表非常大,无法在内存中完成这些操作。因此,此查询 需要与 LINQ to Entities 一起使用,以便它可以转换为有效 SQL 并在数据库上执行。我怀疑这可以通过 where
、join
和 DefaultIfEmpty()
的某种组合而不是 Union
和 Distinct()
来完成,但我现在不知所措.
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())