C# 转换依赖SqlMethods.Like()用于实体框架的Linq表达式树
我最近从使用Linq改为使用Sql改为使用实体框架。我一直在努力解决的一件事是获得一个通用的IQueryable扩展方法,该扩展方法是为LINQtoSQL构建的,用于实体框架。此扩展方法依赖于SqlMethods的Like()方法,该方法是Linq到Sql特定的。我真正喜欢这个扩展方法的地方在于,它允许我在运行时动态地在任何对象上构造一个类似Sql的语句,只需传入一个属性名(作为字符串)和一个查询子句(也作为字符串)。这种扩展方法对于使用flexigrid或jqgrid等网格非常方便。以下是Linq到Sql的版本(摘自本教程:):C# 转换依赖SqlMethods.Like()用于实体框架的Linq表达式树,c#,linq,linq-to-sql,entity-framework,linq-to-entities,C#,Linq,Linq To Sql,Entity Framework,Linq To Entities,我最近从使用Linq改为使用Sql改为使用实体框架。我一直在努力解决的一件事是获得一个通用的IQueryable扩展方法,该扩展方法是为LINQtoSQL构建的,用于实体框架。此扩展方法依赖于SqlMethods的Like()方法,该方法是Linq到Sql特定的。我真正喜欢这个扩展方法的地方在于,它允许我在运行时动态地在任何对象上构造一个类似Sql的语句,只需传入一个属性名(作为字符串)和一个查询子句(也作为字符串)。这种扩展方法对于使用flexigrid或jqgrid等网格非常方便。以下是Li
公共静态IQueryable类似(此IQueryable源、,
字符串属性名称,字符串关键字)
{
var类型=类型(T);
var property=type.GetProperty(propertyName);
var参数=表达式参数(类型为“p”);
var propertyAccess=Expression.MakeMemberAccess(参数,属性);
var常量=表达式。常量(“%”+关键字+“%”);
var like=typeof(SqlMethods).GetMethod(“like”,
新类型[]{typeof(string),typeof(string)});
MethodCallExpression methodExp=
调用(null,like,propertyAccess,constant);
表达式lambda=
Lambda(methodExp,参数);
返回源。其中(λ);
}
使用此扩展方法,我可以简单地执行以下操作:
比如“名字”、“迈克”)
或
另一个列表。例如(“产品名称”、“小部件”)
是否有一种与实体框架相同的方法来实现这一点
提前感谢。我在这里找到了一个很好的解决方案: 它本质上使用string类的“Contains”方法,而不是SqlMethods类的类似方法
表达式条件=Expression.Call(memberAccess,typeof(string).GetMethod(“包含”),Expression.Constant(关键字)) 我在这里找到了一个很好的解决方案: 它本质上使用string类的“Contains”方法,而不是SqlMethods类的类似方法
表达式条件=Expression.Call(memberAccess,typeof(string).GetMethod(“包含”),Expression.Constant(关键字))你可以考虑看这个问题:
你可以考虑看这个:
SQL方法PATINDEX提供了与LIKE相同的功能。因此,您可以使用该方法 或
SQL方法PATINDEX提供了与LIKE相同的功能。因此,您可以使用该方法 或
可查询搜索看起来很棒。谢谢分享链接。可查询搜索看起来很棒。谢谢分享链接。我只是想说你的第一个答案太棒了。几天来,我一直在想如何对Linq EF运行一个简单的正则表达式,这让我达到了目的。谢谢。我只是想说你的第一个答案太棒了。几天来,我一直在想如何对Linq EF运行一个简单的正则表达式,这让我达到了目的。非常感谢。
public static IQueryable<T> Like<T>(this IQueryable<T> source,
string propertyName, string keyword)
{
var type = typeof(T);
var property = type.GetProperty(propertyName);
var parameter = Expression.Parameter(type, "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var constant = Expression.Constant("%" + keyword + "%");
var like = typeof(SqlMethods).GetMethod("Like",
new Type[] { typeof(string), typeof(string) });
MethodCallExpression methodExp =
Expression.Call(null, like, propertyAccess, constant);
Expression<Func<T, bool>> lambda =
Expression.Lambda<Func<T, bool>>(methodExp, parameter);
return source.Where(lambda);
}
.Where(x => SqlFunctions.PatIndex("%123%ABC", x.MySearchField) > 0)
var miSqlPatIndex = typeof(SqlFunctions).GetMethod(
"PatIndex",
BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase,
null,
new Type[] { typeof(string), typeof(string) },
null);
expr = Expression.GreaterThan(
Expression.Call(
miSqlPatIndex,
new Expression[] { Expression.Constant("%123%ABC"), MySearchField }),
Expression.Convert(Expression.Constant(0), typeof(int?)));