gpt4 book ai didi

linq - 使用 Linq PredicateBuilder 嵌套或

转载 作者:行者123 更新时间:2023-12-01 05:10:08 25 4
gpt4 key购买 nike

我正在使用谓词生成器编写以下代码:

IEnumerable<int> ids= new List<int> { 47, 48 };

var predicate = PredicateBuilder.False<Customer>();

predicate = predicate.And(x => x.CreatedAt >= fromDate && x.CreatedAt <= toDate);

foreach (var id in ids)
{
predicate = predicate.Or(x => x.Source.Id == id);
}

var result = Database.Set<Customer>().AsExpandable()
.Where(predicate)
.ToList();

生成的 SQL 看起来像(只是 WHERE 子句):

WHERE ([Filter6].[SourceId] IN (@p__linq__0,@p__linq__1))
AND ([Filter6].[CreatedAt] >= @p__linq__2)
AND ([Filter6].[CreatedAt] <= @p__linq__3)',
N'@p__linq__0 int,
@p__linq__1 int,
@p__linq__2 datetime2(7),
@p__linq__3 datetime2(7)',
@p__linq__0=48,
@p__linq__1=48,
@p__linq__2='2012-02-07 21:59:55.0437985',
@p__linq__3='2012-02-07 22:04:55.5748288'

看起来 id 48 在 SQL 中被分配了两次。不确定为什么?

最佳答案

foreach (var id in ids)
{
predicate = predicate.Or(x => x.Source.Id == id);
}

您正在关闭循环变量。改为制作您的 id 变量的本地副本:

foreach (var id in ids)
{
int localId = id;
predicate = predicate.Or(x => x.Source.Id == localId);
}

因为 Linq 是惰性的,所以你的 Or 谓词和 id 只会在你执行查询时被评估,那时 value idids 集合中的最后一项。 foreach 在这方面的行为将在 C# 5 中更改,届时这将不再是问题。有关更多信息,请阅读 "Closing over the loop variable considered harmful"

关于linq - 使用 Linq PredicateBuilder 嵌套或,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9184942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com