C# 同时从两列中搜索字符串值

C# 同时从两列中搜索字符串值,c#,.net,C#,.net,下面是我在所有不同字段中搜索特定字符串值(searchString)的方法。我的问题是,我希望用户能够在单个搜索中搜索“姓名”和“姓氏”,但搜索查询不会返回任何结果。我在下面的代码片段中标记了我认为应该完成这项工作的代码行 示例:数据库表中有一个名为“Betty Suarez”的人,我希望用户能够在文本框中输入姓名,然后搜索姓名+姓氏,如果找到值,则返回结果。使用下面的代码,我可以输入“Betty”,它将返回“Betty Suarez”和“姓氏”,但只要我输入“Betty Suarez”,就不会

下面是我在所有不同字段中搜索特定字符串值(
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,
                 ...
             };
这里有一个提示:

var name = "Betty";
var surname = "Suarez";

Console.WriteLine(name.Contains("Betty Suarez"));
Console.WriteLine(surname.Contains("Betty Suarez"));
基本思想是,一旦用户输入多词搜索条件,您就必须采用额外的逻辑来切碎输入字符串,并执行如下操作:

... || info.detail.Name.ContainsAnyOf(searchStrings) ...
这里有一个提示:

var name = "Betty";
var surname = "Suarez";

Console.WriteLine(name.Contains("Betty Suarez"));
Console.WriteLine(surname.Contains("Betty Suarez"));
基本思想是,一旦用户输入多词搜索条件,您就必须采用额外的逻辑来切碎输入字符串,并执行如下操作:

... || info.detail.Name.ContainsAnyOf(searchStrings) ...

问题在于,您正在每个子字符串(“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,
                 ...
             };
现在请记住,我已经给出了一个非常简单的示例,您将需要对其进行调整和处理,并包括错误处理,以使其按您需要的方式工作


这可能也是一种效率低下的方法,但它应该让您走上解决整个问题的正确道路。

问题在于您正在搜索每个子字符串(“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,
                 ...
             };
现在请记住,我已经给出了一个非常简单的示例,您将需要对其进行调整和处理,并包括错误处理,以使其按您需要的方式工作


这可能也是一种效率低下的方法,但它应该让您走上解决整个问题的正确道路。

您必须拆分输入并搜索适当的属性

还有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,
             ...
         };

您必须拆分输入并在适当的属性中搜索

还有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,
             ...
         };

我想你少了一些括号,是吗?在同一级别上组合OR和and运算符通常是没有意义的。我认为您缺少一些括号,不是吗?在同一级别上组合OR和and运算符通常没有意义。C#使用括号访问数组元素。;-)@JennyO'Reilly-谢谢你指出这一点,我在工作中使用VB,所以我的大脑陷入了那种模式:)@Taegost谢谢你的回答,伙计!到目前为止我最了解你的:)不过我有一个错误。当我使用您的建议/编码时,我得到的错误是
索引超出了数组的界限
。我找不到任何东西可以帮助我理解它为什么这么做。我对数组也不太了解,很抱歉现在才回复这很好,我理解:)错误是我在错误处理中讨论的问题之一,我的示例是这样写的,如果你同时输入名字和姓氏,如果你只输入一个名字,它将抛出该错误,因为它正在将字符串拆分为一个数组,并使用空格(“”)将其拆分,因此如果只有一个名称,则没有空格,因此它将创建一个仅包含单个元素的数组,因此调用nameParts[1]will抛出错误进行这种性质的多条件搜索有点超出我目前的经验水平,因此不幸的是,我不能给你一个好的、具体的例子来说明如何在所有情况下都能工作,我能做的最好的就是回答为什么会发生这种情况,并为你指出正确的路径:)C#使用括号访问数组元素。;-)@JennyO'Reilly-谢谢你指出这一点,我在工作中使用VB,所以我的大脑陷入了那种模式:)@Taegost谢谢你的回答,伙计!到目前为止我最了解你的:)不过我有一个错误。当我使用您的建议/编码时,我得到的错误是
索引超出了数组的界限
。我找不到任何东西可以帮助我理解它为什么这么做。我对数组也不太了解,很抱歉现在才回复这很好,我理解:)错误是我在错误处理中讨论的问题之一,我的示例是这样写的,如果你同时输入名字和姓氏,如果你只输入一个名字,它将抛出该错误,因为它正在将字符串拆分为一个数组,并使用空格(“”)将其拆分,因此如果只有一个名称,则没有空格,因此它将创建一个仅包含单个元素的数组,因此调用nameParts[1]will抛出错误进行这种性质的多条件搜索有点超出我目前的经验水平,所以很遗憾,我不能给你一个好的、具体的例子,说明如何在所有情况下都能工作,我能做的最好的事情就是回答为什么会发生这种情况,并为你指出正确的道路:)谢谢你的回答,男士:)我不完全理解现在
ContainsAnyOf
将如何帮助我,但我确信我没有完全理解你试图向我解释的内容。(说句公道话,我现在应该已经在床上了),还是说我找不到
ContainsAnyOf
,因为它告诉我它不存在?谢谢你的回答,男士:)我不完全明白
ContainsAnyOf
会有什么帮助