我有以下linq查询,其中我想使用group by子句。
var objList = from o in db.sometable1
join p in db.sometable2 on o.someid equals p.Id
join q in db.sometable3 on p.someid equals q.Id
join r in db.sometable4 on p.someid equals r.Id
join s in db.soetable5 on o.someid equals s.Id
--group o by o.someid // what i am tru=ying
select new
{
o.Id,
r.somecolumn,
r.somecolumn,
s.Name,
o.somecolumn,
p.somecolumn,
q.somecolumn,
r.somecolumn
};
我想根据该表中的一列(someId)从sometable1中获取不同的记录。但我无法做到这一点。如果有人可以帮助我。
答案 0 :(得分:0)
幸运的是,您正在使用LINQ-to-SQL,因此可以简化许多join
s:
var objList = from o in db.SomeTable1
select new
{
o.Id,
o.SomeTable4.SomeColumn1,
o.SomeTable4.SomeColumn2,
o.SomeTable5.Name,
o.SomeColumn,
o.SomeTable2.SomeColumn,
o.SomeTable3.SomeColumn,
o.SomeTable4.SomeColumn3,
};
请参阅Querying Across Relationships和Navigate > Join。
现在进行分组:
var groups = from o in db.SomeTable1
group new
{
o.Id,
o.SomeTable4.SomeColumn1,
o.SomeTable4.SomeColumn2,
o.SomeTable5.Name,
o.SomeColumn,
o.SomeTable2.SomeColumn,
o.SomeTable3.SomeColumn,
o.SomeTable4.SomeColumn3,
} by o.SomeId;
返回IQueryable<IGrouping<some-id-type, anonymous-type>>
,您可以按如下方式使用:
foreach (var group in groups)
{
var someId = group.Key; // the original SomeId property
var theOnlyRecord = group.SingleOrDefault(); // this will throw if more than one record matches someId
}
这假设只有一条记录匹配SomeId
的每个值,因此SingleOrDefault
;如果可以有多个,那么您必须应用某种自己的选择机制,其中最直接的选择机制将SingleOrDefault
替换为FirstOrDefault
,只需采用第一个SomeId
的每个值的重复项。
答案 1 :(得分:-1)
实现此要求的第一种方法是使用MoreLinq库,它支持名为DistinctBy的函数,您可以在其中指定要在其上查找Distinct对象的属性。
var objList = from o in db.sometable
join p in db.sometable2 on o.someid equals p.Id
join q in db.sometable3 on p.someid equals q.Id
join r in db.sometable4 on p.someid equals r.Id
join s in db.soetable5 on o.someid equals s.Id
--group o by o.someid // what i am tru=ying
select new
{
o.Id,
r.somecolumn,
r1.somecolumn,
s.Name,
o1.somecolumn,
p.somecolumn,
q.somecolumn,
r2.somecolumn
}.DistinctBy(x=>new{x.o,x.r,x.r1,x.s,x.o1,x.p,x.q,x.r2});