前100个复杂查询的实体linq

时间:2017-11-28 15:01:54

标签: c# linq

我在表格中有以下结构:

UniqueId    Type        size       RelatedId 
--------------------------------------------
1           honda        100          1
2           mercedes     200          3
3           mazda        300          4
4           mercedes     150          3
5           merecedes    200          3 
6           ford         180          2
7           mercedes     900          5

依旧......

我想写一个查询来获取:

前3个项目按ONLY本田或梅赛德斯按其大小排序。

此外,在考虑特定Type的行时,可能有多行可能具有相同的RelatedId,如果是这种情况,我想考虑该特定RelatedId的最大UniqueId行。

例如:在下表中,我有3行,其中RelatedId = 3表示梅赛德斯类型,

2           mercedes     200          3
4           mercedes     150          3
5           mercedes     200          3 

在这种情况下,我想只考虑具有UniqueId = 5的行,因为这是最新的。 在我的组类型结果集中:" mercedes",我希望我的结果集得到:

mercedes : 
7           mercedes     900          5
5           merecedes    200          3 

我能写出这样的东西:

items.GroupBy( x => x.Type).SelectMany(g => g.OrderByDescending(r => r.size)).Take(10).

我如何分组以便只考虑本田或奔驰?

此外,这包括可能具有相同RelatedId ...的行(我希望在这种情况下对于这些行具有最高UniqueId的行)如何更改查询以解决此问题?

我期望的最终结果集:

1           honda        100          1
7           mercedes     900          5
5           merecedes    200          3 

谢谢大家。

1 个答案:

答案 0 :(得分:0)

首先,您只需在查询中添加Where即可获得本田和梅赛德斯

items.Where(e=>e.Type=="honda" || e.Type=="mercedes")...

现在,对于第二部分,您可以按多列进行分组:

items.Where(e=>e.Type=="honda" || e.Type=="mercedes")
     .GroupBy( x => new{x.Type,x.RelatedId})
     .Select(g => g.OrderByDescending(r => r.UniqueId).FirstOrDefault())
     .OrderByDescending(r => r.size)
     .Take(10);