Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复杂Linq查询更新为DateTime_C#_Linq - Fatal编程技术网

C# 复杂Linq查询更新为DateTime

C# 复杂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

有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进行比较。 如果日期小于或等于当前日期,则将状态值设置为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;
        }
    });

您可以使用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;
                });