2016-12-07 2 views
0

Я занимаю 6 месяцев в моей первой роли разработки и начал использовать больше LINQ на нашем уровне репозитория для запроса нашей БД. Я мог бы использовать некоторую помощь с двумя запрошенными мной запросами.Запрос LINQ с несколькими условиями в предложении WHERE

IQueryable<long> clientsWithoutFeature = from cf in db.Features 
       where cf.Feature != 9 && cf.Feature == 8 
       select cf.Client; 

IQueryable<long> clientsWithFeature = from cf in db.Features 
       where cf.Feature == 9 && cf.Feature == 8 
       select cf.Client; 

Каждый клиент может иметь несколько функций, каждый из которых является отдельной записью/строкой.

Первый запрос должен возвращать всех клиентов, у которых есть функция 8, но не функция 9. Однако она возвращает всех клиентов с помощью функции 8, имеет ли клиент функцию 9.

Второй запрос должен возвращать всех клиентов, имеющих функцию 8, а также иметь функцию 9. Однако он не возвращает никаких клиентов.

Может кто-нибудь, пожалуйста, скажите мне, что не так с моими запросами?

+3

где условие применяется к каждой строке независимо, ли ту же строка/записи есть два столбца «Функция» с несколькими значениями. Я думаю, что ваш запрос неправильный. Это не проблема с Linq. Я не знаком с Linq, но ваш запрос должен быть сконструирован как вложенный запрос с предложением «не в» –

+0

Рассмотрите возможность показа своей модели. –

ответ

1

Ваш sql выполняет, как вы его написали. Вам нужно немного перестроить свой запрос, чтобы выразить то, что вы на самом деле планировали.

Я предпочитаю использовать подзапрос подход так:

IQueryable<long> clientsWithoutFeature = from cf in db.Features 
       where cf.Feature == 8 && !db.Features.Any(x => x.id == cf.id && x.Feature == 9) 
       select cf.Client; 

IQueryable<long> clientsWithFeature = from cf in db.Features 
       where cf.Feature == 8 && db.Features.Any(x => x.id == cf.id && x.Feature == 9) 
       select cf.Client; 

Я не совсем уверен, что ваш первичный ключ столбца. поэтому я просто догадался, что это было idY

+0

Это был отличный ответ и тот, с которым я в конечном итоге пошел, чтобы решить мою проблему. Спасибо @meganaut –

0

Это очень просто. Features - таблица, в которой отдельные строки не могут иметь значения Feature8и9.
Чтобы получить то, что вы хотите, что вам нужно JOIN:

IQueryable<long> clientsWithoutFeature = from cf1 in db.Features 
join cf2 in db.Features on new { cf1.Client, IsTargetFeature = true } 
    equals new { cf2.Client, IsTargetFeature = cf2.Feature = 8 } 
where cf1.Feature != 9 
select cf1.Client; 

IQueryable<long> clientsWithFeature = from cf1 in db.Features 
join cf2 in db.Features on new { cf1.Client, IsTargetFeature = true } 
    equals new { cf2.Client, IsTargetFeature = cf2.Feature = 8 } 
where cf1.Feature == 9 
select cf1.Client; 
Смежные вопросы