使用LINQ实现搜索过滤器的问题

时间:2017-03-30 12:59:07

标签: c# asp.net linq

我正在尝试在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'类型的异常

知道这里有什么问题吗?

2 个答案:

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