Мне нужно написать запрос, который будет выполнять поиск по ключевым словам в таблице базы данных. Код в настоящее время что-то вроде этого (хотя и с жестко заданным набором ключевых слов) выглядит:Запрос с несколькими типами
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 бросает «Доступ к модифицированному закрытия» предупреждение для ключевого слова внутри Еогеасп. Я понимаю ошибку, и подтвердить эту проблему, когда я смотрю на сгенерированный 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 содержит только ссылку на последнее значение («Чарли») ,
Что мне делать, чтобы избежать этой проблемы? Возможно, я мог бы преобразовать рассказы в список, прежде чем применять каждое новое ключевое слово where, но это кажется неэффективным.
решаемые
Спасибо за все ответы. В конечном счете у меня возникли две отдельные проблемы: оба из которых были разрешены:
- Используйте локальную переменную внутри цикла foreach(), чтобы избежать проблемы с доступом «Доступ к модифицированному закрытию».
- Используйте PredicateBuilder в LINQKit, чтобы динамически собирать список предложений OR, чтобы разрешить поиск «любого» стиля.
+1 для быстрых пальцев;) Для получения дополнительной информации, ознакомьтесь с http://blogs.msdn.com/ericlippert/archive/2009/11/12/ close-over-the-loop-variable-thought-harm.aspx –
Я только что добавил эту ссылку к моему сообщению ... lol. – tvanfosson