2013-02-21 5 views
0

Я писал запрос LINQ для фильтрации записей на основе ввода и выбора пользователем. Некоторые из входов могут не предоставляться от пользователя. Поэтому мне нужно фильтровать на основе данного ввода. Я попытался дать значение только для 1 из 5 дополнительных входов. Но запрос ничего не возвращает. Пожалуйста, помогите мне найти правильный запрос. вы можете лучше понять, увидев запрос.Почему мой запрос ничего не возвращает

Код

var model = (from items in Db.Items 
      where ((items.ItemNo == null || 
        items.ItemNo == String.Empty) || 
        ((items.ItemNo.CompareTo(DD.FromItemNo) >= 0) && 
        (items.ItemNo.CompareTo(DD.ToItemNo) <= 0))) && 
        (items.InfoTypeId == 0 || 
        (items.InfoTypeId == DD.InfoType)) && 
        (items.CreatedOn == null || 
        (items.CreatedOn >= DD.Start && 
        items.CreatedOn <= DD.End)) && 
        (items.StatusId == 0 || 
        (items.StatusId == DD.Status)) && 
        (items.LocationId == 0 || 
        (items.LocationId == DD.Location)) && 
        (items.CollectionId == 0 || 
        (items.CollectionId == DD.Collection)) 
      select new ViewModel() 
      { 
       Itemid = items.Id, 
       INo = items.ItemNo, 
       BTags = (from asd in Db.BibContents 
          where asd.BibId == items.BibId && 
           asd.TagNo == "245" && 
           asd.Sfld == "a" 
          select asd.Value).FirstOrDefault(), 
       Sid = (from stat in Db.ItemStatus1 
         where stat.Id == items.StatusId 
         select stat.Description).FirstOrDefault(), 

       Option = DD.Option, 
       CurrItemNo = DD.ItemNumber 
      }).ToList(); 
+10

Ну, у Вас есть * огромное количество условий в этом предложении 'where'. Я предлагаю вам диагностировать это, удалив их все, а затем добавив их обратно по одному. –

+0

Для первого условия работает отлично. При включении второго условия без передачи каких-либо данных для второго условия невозможно получить совпадающую запись для первого условия. – UniqueChar

+0

@JonSkeet, что он должен добавить в качестве первого аргумента, где, если все нужно удалить? Я знаю, что вы используете что-то вроде '1 == 1' в языке базы данных, но возможно ли что-то подобное для LINQ? (или он должен просто удалить «где» вообще) – Default

ответ

0

Вы должны проверить значения DD для null с или 0 с, не те items:

var model = (from items in Db.Items 
    where 
    (
     (DD.ItemNo == null || DD.ItemNo == String.Empty) 
     || (items.ItemNo.CompareTo(DD.FromItemNo) >= 0 && items.ItemNo.CompareTo(DD.ToItemNo) <= 0) 
    ) 
    && (DD.InfoTypeId == 0 || (items.InfoTypeId == DD.InfoType)) 
    && (DD.CreatedOn == null || (items.CreatedOn >= DD.Start && items.CreatedOn <= DD.End)) 
    && (DD.StatusId == 0 || (items.StatusId == DD.Status)) 
    && (DD.LocationId == 0 || (items.LocationId == DD.Location)) 
    && (DD.CollectionId == 0 || (items.CollectionId == DD.Collection)) 
    select ... 
+0

Большое вам спасибо за публикацию этого правильного кода. – UniqueChar