Linq-to-SQL - 如何在子选择中连接两个字段

时间:2018-02-09 18:41:10

标签: c# linq linq-to-sql

当我搜索名字和姓氏时,以下Linq-to-SQL代码不会返回任何客户结果,例如" 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();

3 个答案:

答案 0 :(得分:0)

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

希望它能解决你的问题。

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

答案 1 :(得分:0)

你不尊重字符串的情况:&#34; John&#34;和&#34;约翰&#34;是两个不同的人。

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

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

另外,请记住,空格并不总是空的。如果仍然没有得到结果,则可能需要在名字和姓氏字符串末尾.Trim()删除回车符和空格。

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

你可以通过稍微懒散的搜索保留你所拥有的大部分内容:

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

删除空格,强制它全部变为大写,删除空格,并创建firstnamelastname的搜索键...所以现在你将JOHNDOE(搜索中的字符串)与JOHNDOE(输入)进行比较。它有点草率但在轻量级应用程序中完成工作。

答案 2 :(得分:0)

虽然我非常感谢两位撰稿人的答案,但他们并没有解决我的具体需求。

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

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