Linq 查询过滤器

Linq Query Filter

我有一个 Linq 查询,奇怪的是它总是 returns 一个序列不包含任何元素。数据确实存在,我看到计数:

以下查询returns错误:

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

据我了解,.Where 会根据集合中的结果进行过滤。为什么会报错Contains no elements in sequence.

堆栈跟踪:

at System.Linq.Enumerable.First[TSource](IEnumerable1 source)<br> at ...<>c__DisplayClass5.<btnSearch_Click>b__4(... model) in ...aspx.cs:line 70 at System.Linq.Enumerable.WhereListIterator1.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 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)

试试这个

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();

好吧,关于异常的罪魁祸首是 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 列表中。