C# 修改Linq以返回第一个匹配值
我试图修改下面的Linq查询,以返回max版本的第一个匹配行C# 修改Linq以返回第一个匹配值,c#,linq,C#,Linq,我试图修改下面的Linq查询,以返回max版本的第一个匹配行 +----+------+---------+-----+ | PK | Name | Version | abc | +----+------+---------+-----+ | 1 | Bill | 1 | 7 | | 2 | Bob | 1 | 2 | | 3 | Ben | 1 | 3 | | 4 | Bob | 2 | 2 | | 5 | Be
+----+------+---------+-----+
| PK | Name | Version | abc |
+----+------+---------+-----+
| 1 | Bill | 1 | 7 |
| 2 | Bob | 1 | 2 |
| 3 | Ben | 1 | 3 |
| 4 | Bob | 2 | 2 |
| 5 | Ben | 2 | 3 |
| 6 | Ben | 2 | 3 |
+----+------+---------+-----+
目前它将返回:
+----+------+---------+-----+
| PK | Name | Version | abc |
+----+------+---------+-----+
| 1 | Bill | 1 | 7 |
| 4 | Bob | 2 | 2 |
| 5 | Ben | 2 | 3 |
| 6 | Ben | 2 | 3 |
+----+------+---------+-----+
当我希望它返回时:
+----+------+---------+-----+
| PK | Name | Version | abc |
+----+------+---------+-----+
| 1 | Bill | 1 | 7 |
| 4 | Bob | 2 | 2 |
| 5 | Ben | 2 | 3 |
+----+------+---------+-----+
var source = (from item in baseSource
where item.Version > 0
where item.Published
where db.abcTest.Where(it => it.Published && it.Name == item.Name).Max(it => it.Version) == item.Version
orderby item.Name, item.Version descending
select new
{
item.PK,
item.Name,
item.Version,
item.abc
}
).ToList();
return source;
您需要
GroupBy
此处:-
var result = baseSource.GroupBy(x => x.Name)
.Select(x =>
{
var orderedObj = x.OrderByDescending(z => z.Version)
.ThenByDescending(z => z.abc).FirstOrDefault();
return new
{
PK = orderedObj.PK,
Name = x.Key,
Version = orderedObj.Version ,
abc = orderedObj.abc
};
};
考虑检查
orderedObj
是否存在空值,否则它可能引发空引用异常。下面使用组函数的代码使其正常工作
var source = (from item in baseSource
where item.Version > 0
where item.Published
where db.abcTest.Where(it => it.Published && it.Name == item.Name).Max(it => it.Version) == item.Version
orderby item.Name, item.Version descending
group item by new { item.Name, item.Version} into groupx
select new
{
PK = groupx.FirstOrDefault().PK,
groupx.Key.Name,
groupx.Key.Version,
abc= groupx.Select(it => it.abc.Count()).FirstOrDefault()
}
).ToList();
return source;
可能是
First()
或FirstOrDefault()
?你读过“分组依据”吗?如果你仔细看,我也做过同样的事情;)