2015-06-25 34 views
3

我需要将这些行在两个ID上联合使用,而不使用IEqualityComparer,因为LINQ to Entities不支持这些行。Linq中的自定义联盟到实体

result我需要的BizIdBazId每一个独特的组合,从foos的值,如果ID对从那里来,否则值应为零。这是一个非常简单的例子,实际上这些表格非常大,这些操作不能在内存中完成。因此,此查询需要与LINQ to Entities一起使用,以便它可以转换为有效的SQL并在数据库上执行。我怀疑这可以用where,joinDefaultIfEmpty()的组合来代替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

您可以通过在两个领域,然后让每组的第一项目组:

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

它是安全的假设FOOS永远是第一位在列表或应该是被检查?我认为这会起作用! –

+0

如果你想要一个特定的项目在上面,你应该添加'g.OrderBy(x => x ....)。FirstOrDefault()'。 –

+0

根据这个问题,如果它存在,我需要Value。为了得到这个,我修改了一下你的查询:'foos.Union(bars).GroupBy(x => new {x.bizId,x.bazId})。Select(g => g.OrderByDescending(x => x。分配).FirstOrDefault())'。非常感谢! –