复杂Linq查询更新为DateTime



存在相互关联的A表和B表。我想创建一个linq查询,如果与B表中AID列的整行关系行等于或小于date字段中的今天的日期,该查询将更新a表中的Status值。

例如,根据下表,表A中ID值为1(AAA(和2(BBB(的行的状态值将为1。其状态值不会更改,因为ID值为3(CCC(的行不小于B表中所有相关行的当前日期。

如何编写最稳定、性能最好的linq查询?

今日:2018-7-10一张桌子ID名称状态1 AAA 02 BBB 03 CCC 0B表ID AID日期6 1 2018年5月3日7 2 2018-6-28 2 2018-6-49 3 2018年10月12日10 3 2018-7-7
  1. AID上的分组表B
  2. 在每组中选择"最长"日期。(每个唯一的AID(
  3. 将所选日期与表A中相应的Id进行比较
  4. 如果日期小于或等于当前日期,则将"状态"值设置为true。

    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;
    }
    });
    
  1. 这将从表B中选择AID,其中日期比现在更短
  2. 我们从表A中选择其ID位于列表中的记录上一步
  3. 然后我们更新状态值

    A。Where(a=>B.Where(B=>B.Date<=DateTime.Now(。选择(B=>B.AID(。包含(a.ID((。对于每个(a=>a.状态=1(

/*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();

您可以在LambdaJoinAB表中使用GroupJoin扩展,然后根据您的条件(日期<=今天或任何条件(使用All扩展,然后更新Status。类似

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;
});

C#篡改样本数据。

最新更新