我正在尝试在ASP.Net应用程序中使用LINQ实现搜索过滤器。
但是我遇到了问题。这是我的代码:
var result = (from x in db.ContactSet
select new Models.Contact
{
AccountId = x.AccountId,
FirstName = x.FirstName,
LastName = x.LastName,
FullName = x.FullName,
JobTitle = x.JobTitle,
ParentCustomerId = x.ParentCustomerId,
EMailAddress1 = x.EMailAddress1,
Telephone1 = x.Telephone1,
MobilePhone = x.MobilePhone,
Fax = x.Fax,
GenderCode = x.GenderCode,
BirthDate = x.BirthDate
}); //? Gets all rows
result = result
.Where(x =>
x.FirstName.Contains(model.searchPhrase) ||
x.LastName.Contains(model.searchPhrase)); //? Search Filter
Gets all rows
代码完全可以从我的数据库中获取所有行。但是我遇到了Search Filter
部分代码的问题。
model.searchPhrase
是一个可以为空的字符串。
每次我浏览Search Filter
时都不会返回任何内容(与输入无关。
经过调试后,我注意到在该代码块运行后,我得到以下Exception Error
:
静态成员:'NotSupportedException'是一种类型,在给定的上下文中无效。 非公共成员:'new System.Linq.SystemCore_EnumerableDebugView(result).items'thew是'System.NotSupportedException'类型的异常
知道这里有什么问题吗?
答案 0 :(得分:0)
我已经编写了一个库来帮助解决此问题,并使构建条件查询进行过滤变得更加容易。您可以从此处的NuGet获取软件包:https://www.nuget.org/packages/LinqConditionalExtensions
您的代码可以重写为:
var hasFilter = !string.IsNullOrWhiteSpace(model.searchPhrase);
var result = db.ContactSet
.WhereIf(hasFilter, x => x.FirstName.Contains(model.searchPhrase) || x.LastName.Contains(model.searchPhrase))
.Select(x => new Models.Contact
{
AccountId = x.AccountId,
FirstName = x.FirstName,
LastName = x.LastName,
FullName = x.FullName,
JobTitle = x.JobTitle,
ParentCustomerId = x.ParentCustomerId,
EMailAddress1 = x.EMailAddress1,
Telephone1 = x.Telephone1,
MobilePhone = x.MobilePhone,
Fax = x.Fax,
GenderCode = x.GenderCode,
BirthDate = x.BirthDate
});
WhereIf()
方法仅在条件为true时才应用过滤器。在这种情况下,如果模型的搜索短语不是null或空格。
您可以在此处了解更多信息:https://github.com/xKloc/LinqConditionalExtensions
答案 1 :(得分:-1)
model.searchPhrase是他写的一个可以为空的字符串。您无法在LINQ查询中将数据类型null-able变量与数据类型(字符串变量)进行比较。所以,这是抛出异常。
使用以下代码。它对我有用
string SearchValue="";
try
{SearchValue=model.searchPhrase.Tostring();}catch{}
result = result.Where(x => x.FirstName.Contains(SearchValue) ||
x.LastName.Contains(SearchValue)).ToList();