我有一个包含名字和姓氏的表以及一个看起来像这样的查询:
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()
如何工作,我需要在查询中进行哪些更改才能使其按预期工作?
而不是开始玩and
,or
,StartsWith
,EndsWith
等的组合,让我们分析主要问题:
使用
所以一般的答案是:.Contains()
搜索<< [合并两列]的参数的查询>
where Combine(table.Column1, table.Column2).Contains(TheSearchParameter)
问题是Combine
函数是什么,对此没有通用的答案。
在您的特定情况下,您似乎想搜索由Name
和FirstName
列组合而成的LastName
。
即使通常没有定义该组合(不同的语言具有不同的名称规则),但假设您已想到最常用的名称组合器:
Name = "{FirstName} {LastName}"
然后查询很简单
var TheQuery = (from c in MyDC.Contacts
where (c.FirstName + " " + c.LastName).Contains(TheSearchParameter)
select c.ColumnID).Distinct().ToList();
例如,如果有一个的FirstName:“ John”,LastName:“ Smith”,则上面的查询将匹配 “ John”,“ Smith”,“ John Smith”,但不是“ Smith John”。]Contact
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();
TheSearchParameter
StartsWith
方法。 StartsWith的工作方式类似于SQL where Column LIKE 'Something%'
。您也可以添加EndsWith
来扩大搜索范围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();
var results = MyDC.Contacts
.Where(c => string.Join(" ",c.FirstName,c.LastName).Contains(TheSearchParameter))
.Select(c => c.ColumnId)
.Distinct()
.ToList();
Contains
如何工作
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();