2015-07-27 3 views
-1

У меня есть запрос Linq, странно, хотя он постоянно возвращает последовательность, не содержащую элементов. Данные существуют, я вижу подсчет:Linq Query Filter

  • Производитель: Один элемент
  • лицо: Триста четырнадцать записей

Следующий запрос возвращает ошибку:

var people = Query<PersonModel>(getPeople) 
    .Where(model => model.FirstName.Contains(search) || 
      model.LastName.Contains(search)) || 
      model.ManufacturerId.Contains(manufacturers.First().ManufacturerId.ToString())) 
    .ToList(); 

Я понял, что .Where будет фильтровать на основе результатов из коллекции. Почему ошибка Не содержит элементов в последовательности.?

Трассировка стеки:

at System.Linq.Enumerable.First[TSource](IEnumerable 1 source)
at ...<>c__DisplayClass5.<btnSearch_Click>b__4(... model) in ...aspx.cs:line 70 at System.Linq.Enumerable.WhereListIterator
1.MoveNext() at System.Collections.Generic.List 1..ctor(IEnumerable 1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at ...btnSearch_Click(Object sender, EventArgs e) in ....aspx.cs:line 69 at System.Web.UI.WebControls.Button.OnClick(EventArgs e) at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

+4

Эта ошибка исходит от 'First()' – SLaks

+0

@SLaks Можете ли вы уточнить, я вижу результат? Это потому, что он не был сплющен? – Greg

+0

Что такое трассировка стека? – SLaks

ответ

1

Попробуйте

var people = Query<PersonModel>(getPeople) 
.Where(model => model.FirstName.Contains(search) || 
     model.LastName.Contains(search) || 
     (manufacturers != null && manufacturers.Any(a => a.ManufacturerId == model.ManufacturerId))) 
.ToList(); 
+0

Я посмотрю, может быть, хорошее решение. – Greg

0

Ну, первоначальный комментарий о виновнике к исключению является First() правильно. Я был в состоянии обойти исключение по:

var manufacturers = Build<ManufacturerModel>(getManufacturer) 
    .Where(model => 
      model.ManufacturerName.Contains(search)); 

if(manufacturers.Any()) 
     manufacturer = manufacturers.FirstOrDefault().ManufacturerId.ToString(); 

Затем я обернул мой первоначальный запрос в if для проверки значения в любой попытке отфильтровать на manufacturer или нет. Решение работает, но не является идеальным вариантом лучшей альтернативы.

Другой пример был бы:

people = Build<PersonModel>(getPeople); 
foreach (var person in people) 
{ 
    var m = person.ManufacturerIDs.Split(',') 
     .Where(id => (manufacturers != null && manufacturers.Any(item => String.Compare(item.ManufacturerId.ToString(), id, true) == 0))).ToList(); 

    var r = person.ManufacturerIDs.Split(',') 
      .Where(id => (repAgencies != null && repAgencies.Any(item => String.Compare(item.RepAgencyId.ToString(), id, true) == 0))).ToList(); 

    if (m.Any() || r.Any()) 
      filter.AddRange(people.Where(model => model.PersonId == person.PersonId).ToList()); 
} 

Тогда, когда за пределами этого цикла, просто сделать .Where на людей и добавить сказал результаты в filter списке.