Linq-Sql IQueryable <T>и цепочка операций ИЛИ - PullRequest
1 голос
/ 30 ноября 2009

Я пытаюсь смоделировать:

ГДЕ x.IsActive = true ИЛИ x.Id = 5

Следующее вызывает использование «И» ... как мне имитировать условие «ИЛИ» с IQueryable (qry) и моим обнуляемым int, учитывая, что здесь может быть задействована другая фильтрация, как с фильтром IsActive? *

            if (onlyActiveItems) //bool
            {
                qry = qry.Where(x => x.IsActive == true);
            }

            if (whenSpecifiedMustIncludeRecordWithThisId.HasValue) //int?
            {
                qry = qry.Where(x => x.Id == whenSpecifiedMustIncludeRecordWithThisId.Value);
            }

Я рассмотрел союз, но, похоже, ответ на этот вопрос должен быть намного проще.


Это одно решение, которое позволяет обойти проблему, с которой я сталкиваюсь, когда «объект Nullable должен иметь значение» при попытке объединить все в одном ответе. Что является причиной того, что значение nullable будет оценено, если оно равно null, в противном случае?

            if (whenSpecifiedMustIncludeRecordWithThisId.HasValue)
            {
                qry = qry.Where(x => (!onlyActiveItems || (onlyActiveItems && x.IsActive)) || x.Id == whenSpecifiedMustIncludeRecordWithThisId.Value);
            }
            else
            {
                qry = qry.Where(x => (!onlyActiveItems || (onlyActiveItems && x.IsActive)));
            }

Кажется также, что в некоторых случаях использование свойства .Value для Nullable имеет значение, как видно из другого моего вопроса здесь Linq to SQL Int16 преобразуется в Int32 в команде SQL

Ответы [ 2 ]

2 голосов
/ 30 ноября 2009

Попробуйте это:

qry = qry.Where(x => (onlyActiveItems
                      ? x.IsActive
                      : false) ||
                     (whenSpecifiedMustIncludeRecordWithThisId.HasValue
                      ? x.Id == whenSpecifiedMustIncludeRecordWithThisId
                      : false) ||
                     (!onlyActiveItems && !whenSpecifiedMustIncludeRecordWithThisId.HasValue));

Обратите внимание, что мы сравниваем int? с int, а не с двумя int с.

Я предполагаю, что цель запроса - отфильтровать, если соблюдены определенные условия.

  • Если onlyActiveItems имеет значение true, он проверяет, является ли поле IsActive истинным
  • Если whenSpecifiedMustIncludeRecordWithThisId.HasValue истинно, он проверяет, соответствует ли значение полю Id
  • Если оба истинны, то логически ИЛИ условия
  • Если оба являются ложными, отображаются все записи (если это не намерение, вы можете удалить последнее условие)
0 голосов
/ 25 июня 2010

При работе с "int?" Я обычно сравниваю их, используя object.Equals (i1, i2), например

from r in cxt.table
where object.Equals(r.column, nullableInt)
select r

Это позволяет избежать проблем, связанных с ошибками.

...