繁体   English   中英

使用Linq To SQL在一个字段中搜索多个字符串

[英]Using Linq To SQL to search for multiple strings in a field

我正在尝试使用Linq to SQL在文本列中搜索多个匹配的单词,但是查询没有达到我的期望。

这是我的示例代码:

            string[] nameSearch = new string[2];
            nameSearch[0] = "John";
            nameSearch[1] = "Doe";

            var customers = context.Customers.AsQueryable();
            foreach (string name in nameSearch)
            {
                customers = customers.Where(r => r.CustName.Contains(name));
            }
            Data.Customer[] results = customers.ToArray();

运行的查询是:

    SELECT [t0].[CustName]
    FROM [dbo].[Customer] AS [t0]
    WHERE ([t0].[CustName] LIKE @p0) AND ([t0].[CustName] LIKE @p1)
    -- @p0: Input NVarChar (Size = 5; Prec = 0; Scale = 0) [%Doe%]
    -- @p1: Input NVarChar (Size = 5; Prec = 0; Scale = 0) [%Doe%]

如何解决此查询? (假设要搜索John和Doe,而不是Doe和Doe。)

仅在查询运行时(即在调用ToArray() lambda表达式求值。 届时, name将绑定到数组中的最后一项。

您可以在foreach循环中使用局部变量,以避免在lambda表达式中引用外部name变量:

var customers = context.Customers.AsQueryable();
for (string name in nameSearch) {
    string curName = name;
    customers = customers.Where(r => r.CustName.Contains(curName));
}
Data.Customer[] results = customers.ToArray();

答案:

foreach (string name in nameSearch)
{
    string name_ = name;
    customers = customers.Where(r => r.CustName.Contains(name_));
}

说明:

Lambda函数r => r.CustName.Contains(name)捕获name变量。 同一变量在两次迭代的范围内。 使用块级范围的临时中断会断开此链接,因此lambda函数的每次调用都会拾取具有不同值的不同变量。

string[] nameSearch = new string[2];
nameSearch[0] = "John";
nameSearch[1] = "Doe";


var result = customers.Where(r => nameSearch.Contains(r.CustName));

以上没有错,每次都会覆盖客户!

客户=客户。where(r => r.CustName.Contains(“ John”)&& r.CustName.Contains(“ Doe”));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM