Lambda Expression和LINQ

ep6jt1vc  于 2023-11-14  发布在  其他
关注(0)|答案(7)|浏览(122)

我如何使用表达式树来做这样的事情:

customers.Where(c => c.Name **like** "john");

字符串
我知道这是不可能的,但我想知道我怎么能有类似的东西。
注意:我寻找使用SQL相关LINQ查询的解决方案(如Linq to SQL或Linq to Entities)

cbwuti44

cbwuti441#

你可以试试这个:

customers.where(c=>EF.Functions.Like(c.Name,"%john%");

字符串
我做了一个测试,看看生成的SQL和这是结果

sql = _context.ProdutoPortfolio.Take(10).Where(c => c.NomeProduto.Contains(c.NomeProduto))

sql2 = _context.ProdutoPortfolio.Take(10).Where(c => EF.Functions.Like(c.NomeProduto, $"%{search}%")

结果sql1:如果使用contains,这是结果

DECLARE @__p_0 int = 10;
DECLARE @__search_1 varchar(350) = 'a';

 

SELECT [t].[ProductID], [t].[Cod], [t].[ProductName], [t].[SubThemeName], [t].[ThemeName]
FROM (
     SELECT TOP(@__p_0) [p].[ProductID], [p].[Cod], [p].[ProductName], [p].[SubThemeName], [p].[ThemeName]
     FROM [ProductPortfolio] AS [p]
) AS [t]
WHERE (@__search_1 LIKE '') OR (CHARINDEX(@__search_1, [t].[productName]) > 0)

结果sql2:

DECLARE @__p_0 int = 10;
DECLARE @__Format_2 varchar(350) = '%a%';

 

SELECT [t].[ProductID], [t].[Cod], [t].[ProductName], [t].[SubThemeName], [t].[ThemeName]
FROM (
     SELECT TOP(@__p_0) [p].[ProductID], [p].[Cod], [p].[ProductName], [p].[SubThemeName], [p].[ThemeName]
     FROM [ProductPortfolio] AS [p]
) AS [t]
WHERE [t].[productname] LIKE @__Format_2


SQL 2满足了我的需求,SQL 2胜出

bweufnob

bweufnob2#

customers.Where(c => c.Name.Contains("john"));

字符串

fdbelqdn

fdbelqdn3#

如果您的目标是LINQ to SQL,请使用SqlMethods.Like

customers.Where(c => SqlMethods.Like(c.Name, "%john%"));

字符串
说明:
由于LIKE是一个特定于SQL的构造,并不通用于所有LINQ Query提供程序,因此SqlMethods类及其成员被用作表达式编译器(将表达式树编译为SQL)发出LIKE语句的“提示”。

snz8szmq

snz8szmq4#

首先想到的是Regex.IsMatch
这将最接近于提供您从LIKE获得的功能;例如,您可以使用它来执行以下操作:

var matches = people.Where(p => Regex.IsMatch(p.Name, "A.*[mn]"));

foreach (Person match in matches)
{
    Console.WriteLine(match.Name);
}

字符串
并得到如下输出:

Adam
Aaron
Aidan


如果您的目的只是在Name中查找特定的子串,那么按照其他人的建议使用string.Contains几乎肯定是更好的选择。

gfttwv5a

gfttwv5a5#

using System.Data.Linq.SqlClient;
...
customers.where(c=>SqlMethods.Like(c.Name, "john"));

字符串

5kgi1eie

5kgi1eie6#

在where语句中使用Regex.IsMatch,或者使用更简单的不带通配符的版本:

customers.where(c=>c.Name.Contains("john"));

字符串

pxyaymoc

pxyaymoc7#

下面是我的代码:

string s="somethings";

customers.Where(c => c.Name != null && c.Name.ToLower().Contains(s.ToLower()));

字符串
差不多吧。

相关问题