【问题标题】:Complex Linq Query Update as DateTime复杂的 Linq 查询更新为 DateTime
【发布时间】:2018-07-15 20:05:16
【问题描述】:

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

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

怎样才能写出最稳定、性能最好的 linq 查询?

今天:2018-7-10 一张桌子 ID名称状态 1 AAA 0 2 血脑屏障 0 3 CCC 0 B表 身份证件日期 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

【问题讨论】:

    标签: c# linq


    【解决方案1】:
    1. 在 AID 上对表 B 进行分组
    2. 在每个组中选择“最大”日期。(每个唯一的 AID)
    3. 将所选日期与表 A 中的相应 ID 进行比较。
    4. 如果日期小于或等于当前日期,则将 Status 值设置为 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;
              }
          });
      

    【讨论】:

      【解决方案2】:
      1. 这将从表 B 中选择日期比现在更小的 AID。
      2. 我们从表 A 中选择记录,其 ID 在 List from 上一步
      3. 然后我们更新状态值

        A.Where (a => B.Where(b => b.Date b.AID).Contains(a.ID)).ForEach(a => a.状态 = 1)

      【讨论】:

      • 除非表B所有相关AID行的日期区域小于今天的日期,否则不进行更新。例如,表 A 中与 BID 7 和 8 相关的 BBB 行的状态区将被更新。但 CCC 的状态区不会更新。
      • 如果您使用的是 LINQ to EF,EF 将为您处理这些问题,如果您使用的是 MsSql,您可以在应用程序输出或 sql profiler 中检查生成的查询
      【解决方案3】:
      /*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();
      

      【讨论】:

        【解决方案4】:

        您可以在LambdaJoin AB 表中使用GroupJoin 扩展名,然后将All 扩展名与您的条件(日期

        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# fiddle 带有样本数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-08
          • 2014-02-23
          • 1970-01-01
          相关资源
          最近更新 更多