繁体   English   中英

LINQ不能使用string.contains?

[英]LINQ can't use string.contains?

这是我的代码:

string queryString = "Marco".ToLower();
utenti = db.User.Where(p => 
        queryString.Contains(p.Nickname.ToLower()) ||
            queryString.Contains(p.Nome.ToLower()) ||
            queryString.Contains(p.Cognome.ToLower())).ToList();

但我得到:

String.Contains方法仅支持可在客户端上计算的参数。

为什么? 我不能使用.Contains()

试试.IndexOf 它不是LINQ,不能做Contains ,它的LINQ to Entities和LINQ to SQL不能。

string queryString = "Marco";
utenti = db.User.Where(p => 
    queryString.IndexOf(p.Nickname, StringComparison.OrdinalIgnoreCase) >= 0 ||
        queryString.IndexOf(p.Nome, StringComparison.OrdinalIgnoreCase) >= 0 ||
        queryString.IndexOf(p.Cognom, StringComparison.OrdinalIgnoreCasee) >= 0)
.ToList();

为什么?

LINQ使用延迟执行 这意味着它等待您想要在执行任何操作之前迭代查询结果。 LINQ有3种主要类型:

  1. LINQ to Objects - 当你的IEnumerable已经在堆上时。
  2. LINQ to Entities - 当您想使用Entity Framework查询数据库时。
  3. LINQ to SQL - 当您想使用LINQ to SQL查询数据库时。

在第二个2的上下文中延迟执行意味着您的查询不会在数据库中执行,直到您在foreach块中枚举结果,或调用枚举方法,如.ToList.ToArray等。在此之前,您的查询只是作为表达式树存储在内存中。

如果db.User是内存中的集合,那么您的查询将只是db.User 但是,当数据在数据库中时,LINQ to Entities(或LINQ to SQL)必须将表达式树转换为它所谓的“存储表达式” - 这对于“将我的LINQ表达式转换为SQL”来说只是花哨的讨论。

现在假设你有一个你想要用于查询的自定义C#算法,你做了类似这样的事情:

var result = db.User.Where(x => MyCustomMethod(x));

今天LINQ to Entities无法将您的C#代码转换为SQL查询(存储表达式)。 每天依赖的许多其他C#方法也是如此。 它也不支持.ToLower.ToUpper.StartsWith.EndsWith等。可以转换为存储表达式的C#方法数量有限,而.IndexOf恰好就是其中之一。

但是请记住,我们在这里讨论的只是字符串对象的Contains方法,这对于商店表达式是不支持的。 LINQ to Entities确实支持IEnumerable.Contains 以下是有效的,将与LINQ to Entities一起使用(不确定LINQ to SQL):

var idsIWantToFind = new[] { 1, 2, 3 };
var users = db.Where(x => idsIWantToFind.Contains(x.UserId));

以上相当于执行SQL WHERE UserId IN (1, 2, 3)谓词。

问题是投入的优先考虑。 例如:

a.Contains(b)中; 或b。包含(a);

你最好写:

p.Nickname.Contains(queryString) ...

代替

queryString.Contains(p.Nickname) ...

暂无
暂无

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

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