Построение выражений Linq с переменными - PullRequest
2 голосов
/ 31 августа 2009

Я использую Linq и Entity Framework. У меня есть объект Page Entity, имеющий отношение «многие ко многим» к объекту Tag.

Я хочу создать запрос Linq, который извлекает все страницы, соответствующие всем предоставленным тегам (в форме Int64 []).

Я пробовал различные примеры WhereIn и BuildContainsExpression, но ни один из них не работает должным образом.

Сейчас я пытаюсь перебрать все теги и создать список выражений:

 foreach (Int64 item in Tags)
 {
    Expression<Func<Pages, bool>> tagFilter = c => c.Tags.Any(x => x.TagID == item);
    exp.Add(tagFilter);
 }

Тем не менее, я думаю, что локальная переменная "item" связывается с запросом, потому что он либо использует один тег, либо ни один из них во время выполнения запроса, однако, если я укажу их так:

 Expression<Func<Pages, bool>> tagFilter1 = c1 => c1.Tags.Any(x => x.TagID == 70);
 exp.Add(tagFilter1);
 Expression<Func<Pages, bool>> tagFilter2 = c1 => c1.Tags.Any(x => x.TagID == 130);
 exp.Add(tagFilter2);
 Expression<Func<Pages, bool>> tagFilter3 = c1 => c1.Tags.Any(x => x.TagID == 77);
 exp.Add(tagFilter3);

Используя фактическое число "70", например, он работает как шарм. Я в основном храню выражения в списке и использую LinqKit для And () их.

Есть ли способ сохранить эту динамику?

1 Ответ

4 голосов
/ 31 августа 2009

Измените свой код на:

foreach (Int64 item in Tags)
{
    var temp = item; // this variable is scoped **inside** the loop.
    Expression<Func<Pages, bool>> tagFilter = c => c.Tags.Any(x => x.TagID == temp);
    exp.Add(tagFilter);
}

Для подробного объяснения, прочитайте мой ответ на вопрос "Каково точное определение замыкания?" вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...