我在下面有这个方法,我在所有不同的字段中搜索某个字符串值(searchString
)。我的问题是我希望用户能够在一次搜索中搜索“姓名”和“姓氏”,但搜索查询不会返回任何结果。我已经在下面的代码片段中标记了我认为应该完成这项工作的代码行。
示例:数据库表中有一个名为“Betty Suarez”的人,我希望用户能够在文本框中输入姓名和姓氏,然后搜索姓名+姓氏如果找到值,结果应该返回。使用下面的代码,我可以输入'Betty',它会返回'Betty Suarez'和'姓'相同的人,但只要输入'Betty Suarez',就不会返回任何值。
var result = from info in joinInfo
where info.user.Email.Contains(searchString)
|| info.user.Department.DepartmentName.Contains(searchString)
|| info.detail.Name.Contains(searchString)
|| info.detail.Surname.Contains(searchString)
|| info.detail.Name.Contains(searchString) && info.detail.Surname.Contains(searchString) //--- The problem line ---
|| info.role.RoleName.Contains(searchString)
select new UsersView
{
Id = info.user.Id,
Email = info.user.Email,
...
};
答案 0 :(得分:0)
这里有一个提示:
var name = "Betty";
var surname = "Suarez";
Console.WriteLine(name.Contains("Betty Suarez"));
Console.WriteLine(surname.Contains("Betty Suarez"));
基本思想是,只要用户输入多字搜索条件,您就必须采用额外的逻辑来切断输入字符串并执行以下操作:
... || info.detail.Name.ContainsAnyOf(searchStrings) ...
答案 1 :(得分:0)
问题是因为你在每个子字符串(“Betty”和“Suarez”)中搜索整个字符串(“Betty Suarez”)。
您需要做的是将输入字符串拆分为其组件,例如:
var nameParts = searchString.Split(" ");
var result = from info in joinInfo
where info.user.Email.Contains(searchString)
|| info.user.Department.DepartmentName.Contains(searchString)
|| info.detail.Name.Contains(nameParts[0])
|| info.detail.Surname.Contains(nameParts[1])
|| info.detail.Name.Contains(nameParts[0]) && info.detail.Surname.Contains(nameParts[1])
|| info.role.RoleName.Contains(searchString)
select new UsersView
{
Id = info.user.Id,
Email = info.user.Email,
...
};
现在请记住,我给出了一个非常简单的示例,您将需要调整它并使用它,并包含错误处理以使其按您需要的方式工作。
这可能也是一种效率低下的方法,但它应该让你走上正确的道路来解决整个问题。
答案 2 :(得分:0)
您必须拆分输入并搜索适当的属性。
在你的Where子句中,我认为你需要在预期的错误行中使用括号:
var result = from info in joinInfo
where info.user.Email.Contains(searchString)
|| info.user.Department.DepartmentName.Contains(searchString)
|| info.detail.Name.Contains(searchString)
|| info.detail.Surname.Contains(searchString)
|| (info.detail.Name.Contains(searchString) && info.detail.Surname.Contains(searchString)) //--- The problem line ---
|| info.role.RoleName.Contains(searchString)
select new UsersView
{
Id = info.user.Id,
Email = info.user.Email,
...
};