C# 转换依赖SqlMethods.Like()用于实体框架的Linq表达式树

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

我最近从使用Linq改为使用Sql改为使用实体框架。我一直在努力解决的一件事是获得一个通用的IQueryable扩展方法,该扩展方法是为LINQtoSQL构建的,用于实体框架。此扩展方法依赖于SqlMethods的Like()方法,该方法是Linq到Sql特定的。我真正喜欢这个扩展方法的地方在于,它允许我在运行时动态地在任何对象上构造一个类似Sql的语句,只需传入一个属性名(作为字符串)和一个查询子句(也作为字符串)。这种扩展方法对于使用flexigrid或jqgrid等网格非常方便。以下是Linq到Sql的版本(摘自本教程:):

公共静态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?)));