在 EF Linq to Entities 中使用动态 linq
Using dynamic linq in EF Linq to Entities
我正在运行时构建一个 Linq.Expressions.Expression 然后我想我会像这样使用它:
Type myTypeVariable = viewModel.typeVariable;
DbContext db = //get entity model for myTypeVariable
Expression myExpression = //build a predicate of myTypeVariable from viewModel
var query = (IQueryable<myType>)db.Set(myTypeVariable);
var results = query.Provider.CreateQuery(myExpression);
我遇到的错误是在 .CreateQuery()
阶段:"Linq to Entities query expresions can only be constructed from instances that implement the IQueryable interface."
我的困惑来自这样一个事实,即如果用它替换最后一行我会得到结果?:results = query.Where(c=>c.ID>0).ToList();
我主要关注这个:https://msdn.microsoft.com/en-us/library/bb882637.aspx
如何使用我的表达式谓词从我的 DbSet 中获取结果?
通常构建表达式树是最难的部分。
有关详细信息,请参阅 Building expression trees。
有一些工具和库可以提供帮助。使用门面或工具来帮助构建表达式。例如 Predicate Builder
您可以将表达式传递到通用存储库以在 EF 中执行动态 Linq。
例如:
public virtual IQueryable<TPoco> GetList(Expression<Func<TPoco, bool>> predicate) {
return Context.Set<TPoco>().Where(predicate);
}
// a small sample building an expression for Contains string
public static Expression<Func<TPoco, bool>> GetContainsPredicate<TPoco>(string propertyName, string containsValue)
{
// (tpoco t) => t.propertyName.Contains(value ) as expression
var parameterExp = Expression.Parameter(typeof(TPoco), @"t");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodInfo method = typeof(string).GetMethod(@"Contains", new[] { typeof(string) });
var someValue = Expression.Constant(containsValue, typeof(string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);
return Expression.Lambda<Func<TPoco, bool>>(containsMethodExp, parameterExp);
}
用法:
var someExp = MyTool.GetContainsPredicate("FIELDNAME","SomeString");
var resultQueryable = myRepOfTpoco.GetList(someExp ) ;
我正在运行时构建一个 Linq.Expressions.Expression 然后我想我会像这样使用它:
Type myTypeVariable = viewModel.typeVariable;
DbContext db = //get entity model for myTypeVariable
Expression myExpression = //build a predicate of myTypeVariable from viewModel
var query = (IQueryable<myType>)db.Set(myTypeVariable);
var results = query.Provider.CreateQuery(myExpression);
我遇到的错误是在 .CreateQuery()
阶段:"Linq to Entities query expresions can only be constructed from instances that implement the IQueryable interface."
我的困惑来自这样一个事实,即如果用它替换最后一行我会得到结果?:results = query.Where(c=>c.ID>0).ToList();
我主要关注这个:https://msdn.microsoft.com/en-us/library/bb882637.aspx
如何使用我的表达式谓词从我的 DbSet 中获取结果?
通常构建表达式树是最难的部分。 有关详细信息,请参阅 Building expression trees。
有一些工具和库可以提供帮助。使用门面或工具来帮助构建表达式。例如 Predicate Builder
您可以将表达式传递到通用存储库以在 EF 中执行动态 Linq。 例如:
public virtual IQueryable<TPoco> GetList(Expression<Func<TPoco, bool>> predicate) {
return Context.Set<TPoco>().Where(predicate);
}
// a small sample building an expression for Contains string
public static Expression<Func<TPoco, bool>> GetContainsPredicate<TPoco>(string propertyName, string containsValue)
{
// (tpoco t) => t.propertyName.Contains(value ) as expression
var parameterExp = Expression.Parameter(typeof(TPoco), @"t");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodInfo method = typeof(string).GetMethod(@"Contains", new[] { typeof(string) });
var someValue = Expression.Constant(containsValue, typeof(string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);
return Expression.Lambda<Func<TPoco, bool>>(containsMethodExp, parameterExp);
}
用法:
var someExp = MyTool.GetContainsPredicate("FIELDNAME","SomeString");
var resultQueryable = myRepOfTpoco.GetList(someExp ) ;