Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 修改Linq以返回第一个匹配值_C#_Linq - Fatal编程技术网

C# 修改Linq以返回第一个匹配值

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

我试图修改下面的Linq查询,以返回max版本的第一个匹配行

+----+------+---------+-----+
| 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()
?你读过“分组依据”吗?如果你仔细看,我也做过同样的事情;)