2010-04-27 54 views
3

我想在动态LINQ中使用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\""); 

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

+0

http://stackoverflow.com/a/2456070/1193727 – resnyanskiy 2012-02-17 04:40:01

回答

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%"); 
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

3

这应该为你工作:

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

也许有点晚了,但另一种方法是使用Contains来模拟Like的add 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"); 

如果使用类型的int发送PropertyName,该方法返回您之前,它通过原来的实体。