我如何使用表达式树来做这样的事情:
customers.Where(c => c.Name **like** "john");
字符串我知道这是不可能的,但我想知道我怎么能有类似的东西。注意:我不寻找使用SQL相关LINQ查询的解决方案(如Linq to SQL或Linq to Entities)
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胜出
bweufnob2#
customers.Where(c => c.Name.Contains("john"));
字符串
fdbelqdn3#
如果您的目标是LINQ to SQL,请使用SqlMethods.Like:
customers.Where(c => SqlMethods.Like(c.Name, "%john%"));
字符串说明:由于LIKE是一个特定于SQL的构造,并不通用于所有LINQ Query提供程序,因此SqlMethods类及其成员被用作表达式编译器(将表达式树编译为SQL)发出LIKE语句的“提示”。
LIKE
SqlMethods
snz8szmq4#
首先想到的是Regex.IsMatch。这将最接近于提供您从LIKE获得的功能;例如,您可以使用它来执行以下操作:
Regex.IsMatch
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几乎肯定是更好的选择。
Name
string.Contains
gfttwv5a5#
using System.Data.Linq.SqlClient; ... customers.where(c=>SqlMethods.Like(c.Name, "john"));
5kgi1eie6#
在where语句中使用Regex.IsMatch,或者使用更简单的不带通配符的版本:
customers.where(c=>c.Name.Contains("john"));
pxyaymoc7#
下面是我的代码:
string s="somethings"; customers.Where(c => c.Name != null && c.Name.ToLower().Contains(s.ToLower()));
字符串差不多吧。
7条答案
按热度按时间cbwuti441#
你可以试试这个:
字符串
我做了一个测试,看看生成的SQL和这是结果
型
结果sql1:如果使用contains,这是结果
型
结果sql2:
型
SQL 2满足了我的需求,SQL 2胜出
bweufnob2#
字符串
fdbelqdn3#
如果您的目标是LINQ to SQL,请使用SqlMethods.Like:
字符串
说明:
由于
LIKE
是一个特定于SQL的构造,并不通用于所有LINQ Query提供程序,因此SqlMethods
类及其成员被用作表达式编译器(将表达式树编译为SQL)发出LIKE
语句的“提示”。snz8szmq4#
首先想到的是
Regex.IsMatch
。这将最接近于提供您从
LIKE
获得的功能;例如,您可以使用它来执行以下操作:字符串
并得到如下输出:
型
如果您的目的只是在
Name
中查找特定的子串,那么按照其他人的建议使用string.Contains
几乎肯定是更好的选择。gfttwv5a5#
字符串
5kgi1eie6#
在where语句中使用
Regex.IsMatch
,或者使用更简单的不带通配符的版本:字符串
pxyaymoc7#
下面是我的代码:
字符串
差不多吧。