2013-11-21 2 views
0

Я пытаюсь написать запрос Linq, который проверяет три поля: StateCode, ChannelCode и ZipCode.Запрос Linq для получения поля, если он равен нулю или соответствует определенному значению

Я хочу проверить точное соответствие кода штата и канала. Однако, если запись в базе данных имеет значение null, то я хочу потянуть эту запись. Если это не null, я хочу вытащить его только в том случае, если почтовый индекс соответствует значению. Я попытался написать это несколько разных способов, и каждый из них терпит неудачу. Вот моя последняя попытка:

var similarZips = (from z in _db.ZipCodeTerritory 
        where z.StateCode.Equals(zipCode.StateCode) && 
          z.ChannelCode.Equals(zipCode.ChannelCode) 
        select z).Where(x => x.Id != zipCode.Id && 
          (x.ZipCode.Equals(null) || x.ZipCode.Equals(zipCode.ZipCode))).ToList(); 

Я также дал этому выстрел и получил те же результаты

var similarZips = (from z in _db.ZipCodeTerritory 
        where z.StateCode.Equals(zipCode.StateCode) && 
          z.ChannelCode.Equals(zipCode.ChannelCode) && 
          (z.ZipCode.Equals(null) ? z.ZipCode.Equals(null) : z.ZipCode.Equals(zipCode.ZipCode)) 
        select z).Where(x => x.Id != zipCode.Id).ToList(); 

EDIT

Проблема происходит здесь происходит только тогда, когда значение zipCode.ZipCode является NULL , В этом случае это заявление является избыточным x.ZipCode.Equals(null) || x.ZipCode.Equals(zipCode.ZipCode) - Я в основном прошу его проверить null или что-то такое, что .Equal(null).

Мне нужно переписать запрос, аналогичный приведенному ниже. Однако проблема, с которой я столкнулась, теперь находится в первой части тройного заявления. Если значение zipCode.Zipcode равно null, то я просто хочу захватить все записи с совпадающим состоянием и комбинацией кода канала (любой zip будет делать). Однако, если zip определен, то я хочу только захватить комманды state/channel с соответствующим почтовым индексом или нулевым почтовым индексом. Я застрял на той части, где, если значение zipCode.ZipCode равно null Я говорю запрос, чтобы захватить все записи.

var similarZips = (from z in _db.ZipCodeTerritory 
        where z.StateCode.Equals(zipCode.StateCode) && 
          z.ChannelCode.Equals(zipCode.ChannelCode) && 
          (zipCode.ZipCode.Equals(null) ? 
            <any zip will do> : 
           (z.ZipCode.Equals(zipCode.ZipCode) || z.ZipCode.Equals(null))) 
        select z).Where(x => x.Id != zipCode.Id).ToList();** 

ответ

0

Не можете использовать два запроса?

List<ZipCodeTerritory> similarZips; 

if (zipCode.ZipCode != null) 
{ 
    similarZips = (from z in _db.ZipCodeTerritory 
       where z.StateCode.Equals(zipCode.StateCode) && 
         z.ChannelCode.Equals(zipCode.ChannelCode) && 
         z.ZipCode.Equals(zipCode.ZipCode)).ToList(); 
} 
else 
{ 
    similarZips = (from z in _db.ZipCodeTerritory 
       where z.StateCode.Equals(zipCode.StateCode) && 
         z.ChannelCode.Equals(zipCode.ChannelCode).ToList(); 

} 
+0

Это кажется обрабатывать первый случай неправильно - если ZIP код указан только записи с совпадающим ZIP кодом извлекается, но записи с нулевым ZIP кодом опущены в то время как они должны быть включены, если я понимаю вопрос правильно , –

0

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

var similarZips = (from z in _db.ZipCodeTerritory 
        where (zipCode.ZipCode.Equals(null) ? 
          z.StateCode.Equals(zipCode.StateCode) && 
          z.ChannelCode.Equals(zipCode.ChannelCode) : 
          z.StateCode.Equals(zipCode.StateCode) && 
          z.ChannelCode.Equals(zipCode.ChannelCode) && 
          (z.ZipCode.Equals(zipcodeterritory.ZipCode) || z.ZipCode.Equals(null))) 
        select z).Where(x => x.Id != zipCode.Id).ToList(); 
0
1  z.StateCode.Equals(zipCode.StateCode) 
2 && z.ChannelCode.Equals(zipCode.ChannelCode) 
3 && (
4   (zipCode.ZipCode.Equals(null)) 
5  || 
6   (
7    (!zipCode.ZipCode.Equals(null)) 
8   && 
9    (
10     z.ZipCode.Equals(null) 
11    || 
12     z.ZipCode.Equals(zipCode.ZipCode) 
13    ) 
14   ) 
15  ) 

(1) Матч состояния (2) и канал (3) и (4) либо нет указанного почтового индекса (5), либо (7) существует указанный почтовый индекс (8) и (10), то почтовый индекс записи равен NULL (11) или (12) указанный почтовый индекс.

Как вы можете легко видеть, строка 7 является избыточной, и все это можно свести к следующему.

z.StateCode.Equals(zipCode.StateCode) 
&& z.ChannelCode.Equals(zipCode.ChannelCode) 
&& (
     zipCode.ZipCode.Equals(null) 
    || z.ZipCode.Equals(null) 
    || z.ZipCode.Equals(zipCode.ZipCode) 
    ) 
Смежные вопросы