c# - 在 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 的记录。但是有没有更简单的方法可以以更简单的方式实现这一点并具有可读性和性能?
解决方案
我希望我理解你想要达到的目标。您可以尝试以下方法。
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.AddRange
从Table1
.
推荐阅读
- python-2.7 - PYTHON - 从 Azure Cosmos DB 的集合中删除项目
- reactjs - React Component:更新组件,基于另一个没有关系的组件
- angular - 用字符串修补值
- spring - 如何将标头添加到 URI
- puppeteer - 为什么 puppeteer 向我显示 DOMEXCEPTION :“无法在“文档”上执行 'querySelector'?
- javascript - Node js在完成多行代码之前执行函数
- selenium - 如何执行相同的黄瓜功能或场景 n 次?
- javascript - 箭头函数中的Expo Sound
- angular - 在 Angular 中使用 promise 块之外的变量
- java - 创建用户可以向另一个用户发送请求以进行个人聊天的活动