首页 > 解决方案 > 在 C# 中简化 LINQ 查询

问题描述

表格1

Table1ID   Name  Graduation Version Hobbies  
1            A       Degree    1        B
2            A       Degree    2        C
3            A       Degree    3        D

表2

Table2ID   Table1ID Name  Graduation  Version Address Surname    Date
1              1       A      Degree       1      A     A           08-10-2019
2              2       A      Degree       2      A     A           08-10-2019
3              3       A       Degree      3       A    A

//我想检查Table1中是否存在大于最高版本的版本。其中Table2中的日期列不为空假设对于Name和Degree的组合,Table2中的最高版本为2,因为Table2的日期为空,我想要检查 Table1 中是否存在大于 2 的记录,如果是,则将其添加到新列表中

这就是我正在做的事情。

List<Table2> groupByTable2 = //Operations on Table2 and get highest Version record from db
List<Table1> check = new List<Table1>();
List<Table1> check2 = await _table1.GetAll().ToListAsync();
Foreach(var a in groupByTable2)
{
   List<Table1> check4 = check2.Where(x => x.Name == a.Name && x.Graduation == a.Graduation).ToList();
  If(check4.Any(x=>x.Version > a.Version))
  { 
     check.Add(check2.Where(x=>x.Table1ID == a.Table1ID).First());
  }
}

现在我的支票包含一个 ID 为 3 的记录。但是有没有更简单的方法可以以更简单的方式实现这一点并具有可读性和性能?

标签: c#asp.net.netlinq

解决方案


我希望我理解你想要达到的目标。您可以尝试以下方法。

var result = table2.Where(x=>x.Date!=null)
                   .GroupBy(x=> new {x.Name, x.Graduation})
                   .SelectMany(x=> x.OrderByDescending(c=>c.Version).Take(1))
                   .Join(table1,t2=>t2.Table1ID,t1=>t1.Table1ID,(t2,t1)=>t1)
                   .ToList();
result.AddRange(table1.Where(x=> result.Any(c=>c.Name.Equals(x.Name) 
                                            && c.Graduation.Equals(x.Graduation) 
                                            && c.Version < x.Version)));    

这个想法是首先使用GroupBy和加入来获取具有最高Version数字的项目列表,该列表Table1具有有效的日期Table2。然后,用于List.AddRangeTable1.


推荐阅读