动态Linq中的SQL Like关键字

时间:2010-04-27 02:39:17

标签: dynamic linq-to-sql sql-like

我想在动态LINQ中使用SQL的Like关键字。

我想要的查询是这样的

select * from table_a where column_a like '%search%'

其中column_a可以动态更改为其他列等

在这个动态LINQ中

var result = db.table_a.Where( a=> (a.column_a.Contains("search")) );

但是该列无法动态更改,只有搜索键可以

我们如何创建像

这样的动态LINQ
var result = db.table_a.Where("column_a == \"search\"");

我们可以动态更改列和搜索键

5 个答案:

答案 0 :(得分:3)

这应该适合你:

.Where("AColumnName.Contains(@0)", "Criteria") 

答案 1 :(得分:2)

使用此函数创建ExtensionMethods类

    public static IQueryable<T> Like<T>(this IQueryable<T> source, string propertyName, string keyword)
    {
        var type = typeof(T);
        var property = type.GetProperty(propertyName);
        string number = "Int";
        if (property.PropertyType.Name.StartsWith(number))
            return source;

        var parameter = Expression.Parameter(type, "p");
        var propertyAccess = Expression.MakeMemberAccess(parameter, property);
        var constant = Expression.Constant("%" + keyword + "%");
        MethodCallExpression methodExp = Expression.Call(null, typeof(SqlMethods).GetMethod("Like", new Type[] { typeof(string), typeof(string) }), propertyAccess, constant);
        Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(methodExp, parameter);
        return source.Where(lambda);
    }

然后像这样称呼它:

var result = db.table_a.Like("column_a", "%search%");

答案 2 :(得分:0)

答案 3 :(得分:0)

我不相信LINQ中的LIKE关键字直接转换为SQL。如果你使用表达式树,你可以构建一个,但我还没有那么好。

我做的是这样的:

using System.Data.Linq.SqlClient;

if (!string.IsNullOrEmpty(data.MailerName))
    search = search.Where(a => SqlMethods.Like(a.Mailer.Name, string.Format("%{0}%", data.MailerName)));

其中search是我正在构建的查询,data是包含保存搜索条件的属性的对象。我通过以这种方式列出所有可能的搜索条件来动态构建查询,这会将适当的Where方法添加到search

答案 4 :(得分:0)

可能有点迟了但另一种方法是添加使用Contains模拟Like关键字的Extention方法:

public static class DbHelpers
    {
        public static IQueryable<T> Like<T>(this IQueryable<T> source, string propertyName, string propertyValue)
        {
            var prop = typeof(T).GetProperty(propertyName);
            if (prop == null || prop.PropertyType.Name.StartsWith("Int"))
                return source;

            ParameterExpression parameter = Expression.Parameter(typeof(T), "row");
            Expression property = Expression.Property(parameter, propertyName);
            Expression value = Expression.Constant(propertyValue);

            var containsmethod = value.Type.GetMethod("Contains", new[] { typeof(string) });
            var call = Expression.Call(property, containsmethod, value);
            var lambda = Expression.Lambda<Func<T, bool>>(call, parameter);
            return source.Where(lambda);
        }
    }

使用它:

var foo = entity.AsQueryable().Like("Name", "bla bla");

如果发送PropertyName类型为int,则该方法会将您之前传递的原始实体返回给它。