存在相互关联的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
- AID上的分组表B
- 在每组中选择"最长"日期。(每个唯一的AID(
- 将所选日期与表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; } });
- 这将从表B中选择AID,其中日期比现在更短
- 我们从表A中选择其ID位于列表中的记录上一步
-
然后我们更新状态值
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();
您可以在Lambda
到Join
的A
和B
表中使用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#篡改样本数据。