要进行动态 LINQ 查询,您需要一个支持它的库,或者使用 Expression Tree 自己进行操作
见:Entity Framework Dynamic Query Library
免责声明:我是项目的所有者Eval-Expression.NET
此库允许您在运行时评估、编译和执行代码。
该库还包含动态 LINQ 的扩展方法
维基:Eval Dynamic LINQ
例子
// using Z.Expressions; // Don't forget to include this.
// The filterQuery must use the C# syntax
string filterQuery = "x.Id == 1 && x.Number = 2";
IQueryable<Publication> query = db.Publications.Include(i => i.Product);
query = query.Where(x => filterQuery);
编辑:回答子问题
很好,但是如何按产品过滤?
Entity Framework 不支持 Include 方法中的过滤器。
但是,EF+ 可以
免责声明:我是Entity Framework Plus的所有者
见:EF+ Query IncludeFilter
通过结合这两个库,你可以达到你想要的结果:
// Extension method must be registered, otherwise the library cannot be aware of which extension method exists!
EvalManager.DefaultContext.RegisterExtensionMethod(typeof (QueryIncludeFilterExtensions));
string where1 = "x.Id == 1 && x.Number == 2";
string where2 = "y.Id == 3";
var left2 = ctx.Publications
.Where(x => where1)
.Execute<IQueryable<Publication>>("IncludeFilter(x => x.Product.Where(y => " + where2 + "))")
.ToList();
如果您想尝试此解决方案,请确保下载最新版本的 Eval-Expression.NET。我们刚刚解决了几分钟前通过尝试您的方案发现的问题。
EDIT2:回答子问题
这是我向您推荐的。
在没有我们的库的情况下尝试查询,然后动态尝试。
这样更容易找到编译错误或者你真正想做的事情。
例如,我们可能没有正确理解最初的问题并建议了您不想要的 IncludeFilter。我假设您想过滤多个产品。但是,看起来每个出版物只有一个产品,因此 Where 子句方法显然不存在。
也许这就是你要找的东西:
string where1 = "x.Id == 1 && x.Number == 2 && x.Product.Id == 3";
var left2 = ctx.Publications
.Include(x => x.Product)
.Where(where1)
.ToList();
所以简而言之,通过硬编码(不使用动态)来尝试查询,然后你就会知道如何动态使用它。