Умнее где пункт? - PullRequest
       1

Умнее где пункт?

1 голос
/ 23 сентября 2011

Я недавно экспериментировал с LINQ to SQL, и у меня есть быстрый вопрос.Основная предпосылка - у меня есть поисковый запрос, который содержит марку и модель, которые я использую для поиска в БД, содержащей автомобили.

Выражение для моего предложения Where показано ниже:

.Where(c => c.make == search.make  && c.model == search.model)

Это нормально, когда мой поиск содержит как марку, так и модель.Проблема возникает, когда она содержит только марку (или наоборот), а не оба поля поиска.Я хочу, чтобы он вернул все автомобили этой марки, но он не возвращает ни одной.

Я предполагаю, что это потому, что он ищет марку плюс модель, которая является нулевой или пустой?

Есть ли элегантный способ обойти это, кроме ручного создания запроса с помощью серии шагов типа «если не пусто добавить к запросу»?

Ответы [ 8 ]

3 голосов
/ 23 сентября 2011

Вы пробовали:

.Where(c => (search.make == null || c.make == search.make)  && (search.model == null || c.model == search.model))

Обновление: на самом деле есть хорошая обработка общей проблемы и чистые решения, здесь: LINQ to SQL Where Clause Необязательные критерии .Похоже, консенсус заключается в том, что метод расширения является наиболее чистым.

2 голосов
/ 23 сентября 2011
.Where(c => (search.make == null || c.make == search.make) && 
            (search.model == null || c.model == search.model))
1 голос
/ 23 сентября 2011

ИМО, разделить его:

IQueryable<Car> query = ...
if(!string.IsNullOrEmpty(search.make))
    query = query.Where(c => c.make == search.make);
if(!string.IsNullOrEmpty(search.model))
    query = query.Where(c => c.model== search.model);

Это создает наиболее подходящий TSQL, поскольку он не будет включать избыточные предложения WHERE или дополнительные параметры, что позволит СУБД оптимизировать (отдельно) запросы "make", "model" и "make and model".

0 голосов
/ 23 сентября 2011
Where(c => (search.make == null || c.make == search.make) && 
           (search.model == null || c.model == search.model))
0 голосов
/ 23 сентября 2011
.Where(c => (string.IsNullOrEmpty(search.make) || c.make == search.make) &&
            (string.IsNullOrEmpty(search.model) || c.model == search.model))

Предполагается, что свойства являются строками.

0 голосов
/ 23 сентября 2011
.Where(c => (string.IsNullOrEmpty(c.make) || c.make == search.make) && 
            (string.IsNullOrEmpty(c.model) || c.model == search.model))
0 голосов
/ 23 сентября 2011

вы могли бы написать что-то вроде этого:

.Where(c => c.make == search.make ?? c.make && c.model == search.model ?? c.model)
0 голосов
/ 23 сентября 2011

Это должно работать.

.Where(c => 
    (search.make == null || c.make == search.make) &&
    (search.model == null || c.model == search.model))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...