使用.Contains()搜索结合两列的参数的查询

问题描述 投票:5回答:13

我有一个包含名字和姓氏的表以及一个看起来像这样的查询:

var TheQuery = (from c in MyDC.Contacts
                where (c.FirstName.Contains(TheSearchParameter)  ||
                       c.LastName.Contains(TheSearchParameter))
                select c.ColumnID).Distinct().ToList();

[如果用户搜索John或Smith,将返回记录,但是如果用户搜索John Smith,则没有记录返回。 Contains()如何工作,我需要在查询中进行哪些更改才能使其按预期工作?

c# linq linq-to-sql
13个回答
4
投票

而不是开始玩andorStartsWithEndsWith等的组合,让我们分析主要问题:

使用.Contains()搜索<< [合并两列]的参数的查询>

所以一般的答案是:

where Combine(table.Column1, table.Column2).Contains(TheSearchParameter)

问题是Combine函数是什么,对此没有通用的答案。

在您的特定情况下,您似乎想搜索由NameFirstName列组合而成的LastName

即使通常没有定义该组合(不同的语言具有不同的名称规则),但假设您已想到最常用的名称组合器:

Name = "{FirstName} {LastName}"

然后查询很简单

var TheQuery = (from c in MyDC.Contacts where (c.FirstName + " " + c.LastName).Contains(TheSearchParameter) select c.ColumnID).Distinct().ToList();

例如,如果有一个

Contact

FirstName“ John”LastName“ Smith”,则上面的查询将匹配 “ John”“ Smith”“ John Smith”,但不是“ Smith John”。]

0
投票

0
投票
string[] parametersArray = null; int parametersCount = 0; if(!string.IsNullOrEmpty(TheSearchParameter)) { parametersArray = TheSearchParameter.Split(new char[0],StringSplitOptions.RemoveEmptyEntries); parametersCount = parametersArray.Length; } var TheQuery = (from c in MyDC.Contacts where (parametersCount == 0 || (parametersCount > 0 && (parametersArray.Contains(c.FirstName) || parametersArray.Contains(c.LastName)))) select c.ColumnID).Distinct().ToList();

0
投票
以上两个答案如果搜索全名都不会返回,因为它们仅使用名字和姓氏搜索

-1
投票
TheSearchParameter

1
投票
您可能考虑在LINQ表达式中添加StartsWith方法。 StartsWith的工作方式类似于SQL where Column LIKE 'Something%'。您也可以添加EndsWith来扩大搜索范围

1
投票
var TheQuery = (from c in MyDC.Contacts where ((c.FirstName.Contains(TheSearchParameter) && c.LastName.Contains(TheSearchParameter)) || (c.FirstName.Contains(TheSearchParameter) || c.LastName.Contains(TheSearchParameter))) select c.ColumnID).Distinct().ToList();

1
投票
据我目前的理解,您想跨列搜索单词。虽然我确定我还没有完全理解需求,但是我想提出以下想法。希望您可以将其变成一个完整的解决方案:

1
投票
您在这里走(我更喜欢使用lambda,但您不必这样做:]]

var results = MyDC.Contacts .Where(c => string.Join(" ",c.FirstName,c.LastName).Contains(TheSearchParameter)) .Select(c => c.ColumnId) .Distinct() .ToList();


1
投票
Contains如何工作

1
投票

0
投票

0
投票
    如果我们假设名字由名字和姓氏组成仅,并且您的数据中没有中间名。用户全名=名+姓。也许您可以尝试以下代码:
  1. var TheQuery = (from c in MyDC.Contacts where ((TheSearchParameter.Contains(c.FirstName) && TheSearchParameter.StartsWith(c.FirstName)) || (TheSearchParameter.Contains(c.LastName) && TheSearchParameter.EndsWith(c.FirstName))) select c.ColumnID).Distinct().ToList();
© www.soinside.com 2019 - 2024. All rights reserved.