我想在动态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")) );
但是该列无法动态更改,只有搜索键可以
我们如何创建像
这样的动态LINQvar result = db.table_a.Where("column_a == \"search\"");
我们可以动态更改列和搜索键
答案 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)
http://weblogs.asp.net/rajbk/archive/2007/09/18/dynamic-string-based-queries-in-linq.aspx
增加:
使用表达式树 How do I create an expression tree to represent 'String.Contains("term")' in C#? 这就是动态linq库在内部的作用。
答案 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
,则该方法会将您之前传递的原始实体返回给它。