Entity Framework + условно добавленные условия Where () - PullRequest
2 голосов
/ 06 октября 2010

Это сводит меня с ума.Что мне здесь не хватает.Я использую EF, и если у меня есть код, подобный следующему:

using (LexiconEntities ctx = new LexiconEntities())
{
  var query = from w in ctx.Words
        select new WordEntryDataModel
        {
          Word = w.Anagram,
          NumOfAnagrams = w.NumAnagrams.Value,
          Length = w.Length.Value,
          ...
        };

  SearchCriterion c1 = new SearchCriterion();
  SearchCriterion c2 = new SearchCriterion();

  c1.MinValue = 3; 
  c1.MaxValue = 3;

  c2.MinValue = 4;
  c2.MaxValue = 4;

  query = query.Where(w => w.Length >= c1.MinValue && w.Length <= c1.MaxValue);
  query = query.Where(w => w.NumOfAnagrams >= c2.MinValue && w.NumOfAnagrams <= c2.MaxValue);

  ...
}

И когда я отлаживаю запрос, я получаю правильные результаты (8 записей).Это также работает, как и ожидалось в Linqpad (что чертовски круто).

Но если я создаю критерии поиска как список объектов критериев и динамически добавляю предложения Where (), перебирая критерии поиска какследует:

  foreach (SearchCriterion c in criteria.SearchCriteria)
  {
    switch (c.Type)
    {
      case SearchCriterionType.WordLength:
        query = query.Where(w => w.Length >= c.MinValue && w.Length <= c.MaxValue);
        break;
      case SearchCriterionType.NumberOfAnagrams:
        query = query.Where(w => w.NumOfAnagrams >= c.MinValue && w.NumOfAnagrams <= c.MaxValue);
        break;
      ...
      case SearchCriterionType.NumberOfVowels:
        query = query.Where(w => w.NumOfVowels >= c.MinValue && w.NumOfVowels <= c.MaxValue);
        break;
    }
  }
  ...

Я получаю совершенно разные (и неверные) результаты.Я отладил оператор switch, и в моих критериях поиска есть два правильно построенных объекта критерия, установленных на правильные значения.Есть что-то в условно добавленных выражениях where, которые не нравятся моему запросу.

Что я делаю не так?

1 Ответ

3 голосов
/ 07 октября 2010

Закрытие. Назначьте c локальной переменной в цикле. Также смотрите мой SO ответ здесь

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