C# 复杂Linq查询更新为DateTime
有A表和B表相互关联。我想创建一个linq查询,如果B表中带有AID列的整行关系行等于或小于date字段中今天的日期,该查询将更新a表中的状态值 例如,根据下表,表A中ID值为1 AAA和2 BBB的行的状态值将为1。其状态值不会更改,因为ID值为3的行不小于B表中所有相关行的当前日期 如何编写最稳定、性能最好的linq查询 Today : 2018-7-10 A Table ID Name Status 1 AAA 0 2 BBB 0 3 CCC 0 B Table ID AID Date 6 1 2018-5-3 7 2 2018-6-2 8 2 2018-6-4 9 3 2018-10-12 10 3 2018-7-7 这将从表B中选择日期比现在短的辅助工具。 我们从表A中选择记录,其ID位于列表中 上一步 然后我们更新状态值 A.其中A=>B.其中B=>B.日期B.AID.Containsa.ID.ForEach A=>A.状态=1 关于援助的分组表B 选择每个组中的最大日期。每个唯一的辅助 将所选日期与表A中的相应Id进行比较。 如果日期小于或等于当前日期,则将状态值设置为trueC# 复杂Linq查询更新为DateTime,c#,linq,C#,Linq,有A表和B表相互关联。我想创建一个linq查询,如果B表中带有AID列的整行关系行等于或小于date字段中今天的日期,该查询将更新a表中的状态值 例如,根据下表,表A中ID值为1 AAA和2 BBB的行的状态值将为1。其状态值不会更改,因为ID值为3的行不小于B表中所有相关行的当前日期 如何编写最稳定、性能最好的linq查询 Today : 2018-7-10 A Table ID Name Status 1 AAA 0 2 BBB 0 3 CCC 0 B Table ID AI
TableB.GroupBy(x => x.AId).Select(group => new { identifier = group.Key, MaxDate = group.Max(m => m.Date) }).ToList().ForEach(y =>
{
if (y.MaxDate <= DateTime.Now.Date)
{
TableA.Where(g => g.Id == y.identifier).First().Status = true;
}
});
您可以使用Lambda中的GroupJoin扩展来连接A和B表,然后使用条件日期的All扩展,除非表B中所有相关辅助行的日期区域小于今天的日期,否则不应进行更新。例如,表A中与标书7和8相关的BBB行的状态区域将被更新。但CCC的状态区域不会更新。如果使用LINQ to EF,EF将为您解决此问题。如果使用MsSql,您可以在应用程序输出或sql探查器中检查生成的查询
/*Fetching those aS Who meet the condition. */
var aList1=(from b in dbset.Bs.Where(x=>x.Date<DateTime.Now)//TimeZone may vary
join a in dbSet.As
on b.AID equals a.ID
select a);
/*Fetching those aS Who don't meet the condition. */
var aList2=(from b in dbset.Bs.Where(x=>x.Date>=DateTime.Now)//TimeZone may vary
join a in dbSet.As
on b.AID equals a.ID
select a);
/*Removing those aS from list1 which occured in list2 */
var aFinalList=(aList1.Except(aList2)).ToList();
/*Updating status */
aFinalList.ForEach(x=>x.Status=1);
aFinalList.SaveChanges();
var lstResult = lstA.GroupJoin(lstB, a => new { a.Id }, b => new { Id = b.AId }, (a, b) => new { a, b })
.Select(x =>
{
if (x.b.All(y => y.Date <= DateTime.Now)) //Actual condition here.
{
x.a.Status = true;
return x.a;
}
else return x.a;
});