Linq-to-SQL - 如何连接子 select 中的两个字段

Linq-to-SQL - how to concatenate two fields in a sub select

当我搜索名字和姓氏时,以下 Linq-to-SQL 代码不会 return 任何客户结果,例如 "Joe Smith"。我连接 FirstNameLastName 的语法不正确 - 你能帮忙吗?

var searchText = "Joe Smith";

IQueryable<Customer> query = dc.Customer
                               .Where(cust => cust.Contact.Select(con => con.FirstName + " " + con.LastName).Contains(searchText));

var customers = query.AsEnumerable().ToArray();

据我所知这是你的解决方案

希望能解决您的问题。

IQueryable<Customer> query = dc.Customer.Where(cust =>new {fullName=cust.FirstName+" "+cust.LastName}.fullName.Contains(searchText));

var customers = query.AsEnumerable().ToArray();

这是经过编辑的解决方案,请查看并告诉我

IQueryable<Customer> query = dc.Customer.Where(cust =>cust.Contact.Where(con=>new{FullName=con.FirstName+" "+con.LastName}.FullName.Contains(searchText)).Any());

var customers = query.AsEnumerable().ToArray();

您不尊重字符串的大小写:"John" 和 "john" 是两个不同的人。

    IQueryable<Customer> query = dc.Customer
                                   .Where(cust =>
                                   cust.Contact.Select(con => 
                                   con.FirstName.ToUpperInvariant() 
                                   + " " +          
                                   con.LastName.ToUpperInvariant())
                                  .Contains(searchText.ToUpperInvariant()));

ToUpperInvariant() 使字符串不区分区域性,并通过将它们读取为大写来强制您的返回值和搜索文本不区分大小写。不要以这种方式使用小写字母,因为当您使用对文化更敏感的方法时,这可能会导致问题。如果您像这样使用小写字母,VS 2017 将显示警告并建议改用大写字母来修复它。

此外,请记住白色space 并不总是空的。如果您仍然没有得到结果并且应该是,您可能需要在名字和姓氏字符串的末尾添加 .Trim() 以删除回车符 returns 和 whitespace。

最后,只是一个提示,作为建议;最好将名字和姓氏分成两个单独的搜索,而不是合并名字和姓氏,在其中插入 space,然后搜索全名。这可以防止您在消化之前修改字符串而导致的意外。例如,如果您的输入是 "John " "Doe",因为名字字段中有一个 space,您的代码将创建 "John Doe"。当它搜索 "John Doe" 时,它不会找到任何记录。

您可以通过稍微懒惰的搜索保留大部分内容:

IQueryable<Customer> query = dc.Customer
                                   .Where(cust =>
                                   cust.Contact.Select(con => 
                                   con.FirstName.ToUpperInvariant().Trim()
                                   +                                   
                                   con.LastName.ToUpperInvariant().Trim())                                      
                                     .Contains(searchText.ToUpperInvariant()
                                         .Replace(" ", string.Empty).Trim()));

这会删除 space,强制将其全部转为大写,删除白色 spaces,并创建 firstnamelastname 的搜索键...所以现在您正在比较 JOHNDOE(来自搜索)到 JOHNDOE(输入)。它有点草率,但在轻量级应用程序中可以胜任。

虽然我非常感谢两位贡献者的回答,但他们并没有解决我的具体需求。

我的解决方案...首先从联系人中获取 CustomerIds table,然后查找客户记录:

var customerIds = dc.Contact
.Where(c => (c.FirstName + " " + c.LastName).Contains(text))
                      .Select(c => c.CustomerId)
.Distinct()
.ToArray();

var customers = dc.Customer
.Where(c => customerIds.Contains(c.Id))
.ToArray();