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.WhereListIterator
1.MoveNext() at
System.Collections.Generic.List1..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)
试试这个
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
列表中。
我有一个 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](IEnumerable
1 source)<br> at ...<>c__DisplayClass5.<btnSearch_Click>b__4(... model) in ...aspx.cs:line 70 at System.Linq.Enumerable.WhereListIterator
1.MoveNext() at System.Collections.Generic.List1..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)
试试这个
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
列表中。