Visual Studio 使用LINQ基于三列搜索完整名称

c0vxltue  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(152)

我尝试在Visual Studio中使用LINQ进行搜索。在我的数据库中,我有三个字段“Firstname”、“LastNamePrefix”和“Lastname”。我的搜索字符串是Searchtext。我如何进行一个简单的LINQ查询来搜索所有字段?
我现在的想法是:

query = query.Where(x => x.FirstName.Contains(input.SearchText) || x.LastNamePrefix.Contains(input.SearchText) || x.LastName.Contains(input.SearchText));

有了这个,我真的很接近解决方案,但当我试图合并名字与姓氏前缀和姓氏,我没有得到任何结果。
例如,Jan货车Lauw这个名字:

I search Jan. It works
I search van. It works
I search Lauw. It works
I search Jan van Lauw. No results.

我尝试使用以下函数创建一个列,将三列组合为一个全名:

public static string CreateFullname(string firstName, string lastNamePrefix, string lastName)
{
    return $"{firstName} {lastNamePrefix} {lastName}".Replace("  ", " ").Trim();
}

如果我尝试像下面的代码那样使用此列,我会得到以下错误:
LINQ to Entities中不支持指定的类型成员“FullName”。仅支持初始值设定项、实体成员和实体导航属性。

query = query.Where(x => x.FullName.Contains(input.SearchText));

如何在多列中搜索?

bmp9r5qi

bmp9r5qi1#

不能在查询中使用自定义(未Map)属性(如FullName),但可以内联合并属性:

query.Where(x => (x.FirstName.Trim() + " " + x.LastNamePrefix.Trim() + " " + x.LastName.Trim()).Trim().Contains(input.SearchText));
cczfrluj

cczfrluj2#

使用计算属性时,LINQ to entities无法生成查询。请尝试在查询中使用就地字符串串联。
我不确定LINQ to Entities是否能够将此表达式转换为SQL“like”查询,但我在Entity Framework中使用了这种方法。

query = query
    .Where(x => (x.FirstName + " " + x.LastNamePrefix + " " + x.LastName).Contains(input.SearchText));

您可以仅合并两个OR查询,以使搜索更加灵活:

query = query
    .Where(x => (x.FirstName + " " + x.LastNamePrefix + " " + x.LastName).Contains(input.SearchText) 
              || (x.FirstName + " " + x.LastName).Contains(input.SearchText));
flvtvl50

flvtvl503#

您建议将名称合并为全名并删除""的建议是错误的,原因如下:

    • 搜索文本**:'abc'
    • 名字**:'ab'
    • 姓氏前缀**:"丙"
    • 姓氏**:"无所谓"

您希望的结果为false,因为First Name或LastNamePrefix和LastName中没有'abc',但在您的建议中,它将被接受。
如果按3个参数搜索,则必须比较这些参数

相关问题