gpt4 book ai didi

c# - 查询多个位置

转载 作者:行者123 更新时间:2023-11-30 20:13:03 26 4
gpt4 key购买 nike

我需要编写一个查询来对数据库表执行关键字搜索。目前的代码看起来像这样(尽管有一组硬编码的关键字):

var keywords = new [] { "alpha", "bravo", "charlie" };
IQueryable<Story> stories = DataContext.Stories;

foreach( var keyword in keywords )
{
stories = from story in stories where story.Name.Contains ( keyword ) );
}

return stories;

ReSharper 针对 foreach 中的关键字 抛出“访问修改后的闭包”警告。我理解错误,并在查看生成的 SQL 时确认问题:

SELECT [t0].[Id], [t0].[Name]
FROM [dbo].[Story] AS [t0]
WHERE (([t0].[Name] LIKE @p0))
AND (([t0].[Name] LIKE @p1))
AND (([t0].[Name] LIKE @p2))
-- @p0: Input NVarChar (Size = 9; Prec = 0; Scale = 0) [%charlie%]
-- @p1: Input NVarChar (Size = 9; Prec = 0; Scale = 0) [%charlie%]
-- @p2: Input NVarChar (Size = 9; Prec = 0; Scale = 0) [%charlie%]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1

因为 关键字 迭代器在循环期间发生变化,所以我的 SQL 只包含对最后一个值(“charlie”)的引用。

我应该怎么做才能避免这个问题?在应用每个新关键字 where 子句之前,我可能可以将可查询的 stories 转换为列表,但这似乎效率不高。

已解决

谢谢大家的回答。最终我遇到了两个不同的问题,这两个问题都已解决:

  1. 在 foreach() 循环中使用局部变量以避免“访问修改后的闭包”问题。
  2. 使用 LINQKit 中的 PredicateBuilder 动态组合 OR 子句列表以允许“任意”式关键字搜索。

最佳答案

将变量分配给 foreach block 范围内的临时变量,以便每次都能获得一个新变量。

foreach( var keyword in keywords )
{
var kwd = keyword;
stories = from story in stories where story.Name.Contains ( kwd ) );
}

Eric Lippert 有一个 good article (或两个)解释在闭包中包含循环变量的危险以及如何避免它。

关于c# - 查询多个位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1941040/

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