无法让 Dynamic Linq 工作
Can't get Dynamic Linq to work
我正在尝试使用 Dynamic Linq 库来查询我的 entity framework 数据源。我已将正确的包添加到我的项目中并使用了以下语法
var salesEntities = dashboardEntity.FactSales.Where(d => d.DateKey >= startDate).Where(d => d.DateKey <= endDate)
.Where(c => c.CompanyID == companyID)
.Where("StoreID==@0",1)
.ToList();
我也试过了
.Where("StoreID=1")
基于我在 ScottGu 博客 post 上找到的示例,大多数动态查询 SO 问题似乎都暗示了这一点。谁能帮我看看我缺少什么来完成这项工作?
它不会产生错误,它根本无法 return 任何数据。
不知道你是否解决了这个问题,但我刚刚注意到你对我的评论的回复。
我认为你在比较 StoreID
.
时缺少的是 =
而不是 ==
var salesEntities = dashboardEntity.FactSales.Where(d => d.DateKey >= startDate).Where(d => d.DateKey <= endDate)
.Where(c => c.CompanyID == companyID)
.Where("StoreID = @0",1)
.ToList();
TL;DR
您确定为此需要 Dynamic LINQ 吗?
List<int> storeIDs = new List<int>() {1,2,3};
var salesEntities = dashboardEntity.FactSales
.Where(d => d.DateKey >= startDate)
.Where(d => d.DateKey <= endDate)
.Where(c => c.CompanyID == companyID)
.Where(c => storeIDs.Contains(c.StoreID))
.ToList();
长版
LINQ 允许编译器生成的表达式:
IQueryable<FactSales> qry;
qry = qry.Where(x => x.DateKey >= startDate);
如果表达式需要在运行时更改,可以在 System.Linq.Expressions.Expression
class:
中使用静态方法构建表达式
//using static System.Linq.Expressions.Expression;
//x
var parameter = Parameter(typeof(FactSale));
//x.DateKey
var dateKey = MakeMemberAccess(parameter, typeof(FactSales).GetProperty("DateKey"));
//(the value in startDate, as if it had been written in)
var startDateConst = Constant(startDate);
//x.DateKey >= (value of startDate)
var comparison = GreaterThanOrEqual(dateKey, startDateConst);
//x => x.DateKey >= (value of startDate)
var lmbd = Lambda<Func<FactSale,bool>>(comparison, new [] {prm});
//pass the expression into the Queryable.Where method
qry = qry.Where(lmbd);
动态 LINQ 库(可以找到其最新版本 here)允许使用字符串生成表达式:
IQueryable<FactSales> qry;
qry = qry.Where("DateKey >= @0", startDate);
当表达式在编译时未知时,动态 LINQ 非常有用,但在这种情况下,表达式在编译时已知(在这种情况下,使用 List<T>.Contains
method。因此我不在此处查看使用 Dynamic LINQ 的任何理由。
N.B。我仍然不知道为什么这不起作用:
var qry = dashboardEntity.FactSales.Where("StoreID = 1");
我正在尝试使用 Dynamic Linq 库来查询我的 entity framework 数据源。我已将正确的包添加到我的项目中并使用了以下语法
var salesEntities = dashboardEntity.FactSales.Where(d => d.DateKey >= startDate).Where(d => d.DateKey <= endDate)
.Where(c => c.CompanyID == companyID)
.Where("StoreID==@0",1)
.ToList();
我也试过了
.Where("StoreID=1")
基于我在 ScottGu 博客 post 上找到的示例,大多数动态查询 SO 问题似乎都暗示了这一点。谁能帮我看看我缺少什么来完成这项工作?
它不会产生错误,它根本无法 return 任何数据。
不知道你是否解决了这个问题,但我刚刚注意到你对我的评论的回复。
我认为你在比较 StoreID
.
=
而不是 ==
var salesEntities = dashboardEntity.FactSales.Where(d => d.DateKey >= startDate).Where(d => d.DateKey <= endDate)
.Where(c => c.CompanyID == companyID)
.Where("StoreID = @0",1)
.ToList();
TL;DR
您确定为此需要 Dynamic LINQ 吗?
List<int> storeIDs = new List<int>() {1,2,3};
var salesEntities = dashboardEntity.FactSales
.Where(d => d.DateKey >= startDate)
.Where(d => d.DateKey <= endDate)
.Where(c => c.CompanyID == companyID)
.Where(c => storeIDs.Contains(c.StoreID))
.ToList();
长版
LINQ 允许编译器生成的表达式:
IQueryable<FactSales> qry;
qry = qry.Where(x => x.DateKey >= startDate);
如果表达式需要在运行时更改,可以在 System.Linq.Expressions.Expression
class:
//using static System.Linq.Expressions.Expression;
//x
var parameter = Parameter(typeof(FactSale));
//x.DateKey
var dateKey = MakeMemberAccess(parameter, typeof(FactSales).GetProperty("DateKey"));
//(the value in startDate, as if it had been written in)
var startDateConst = Constant(startDate);
//x.DateKey >= (value of startDate)
var comparison = GreaterThanOrEqual(dateKey, startDateConst);
//x => x.DateKey >= (value of startDate)
var lmbd = Lambda<Func<FactSale,bool>>(comparison, new [] {prm});
//pass the expression into the Queryable.Where method
qry = qry.Where(lmbd);
动态 LINQ 库(可以找到其最新版本 here)允许使用字符串生成表达式:
IQueryable<FactSales> qry;
qry = qry.Where("DateKey >= @0", startDate);
当表达式在编译时未知时,动态 LINQ 非常有用,但在这种情况下,表达式在编译时已知(在这种情况下,使用 List<T>.Contains
method。因此我不在此处查看使用 Dynamic LINQ 的任何理由。
N.B。我仍然不知道为什么这不起作用:
var qry = dashboardEntity.FactSales.Where("StoreID = 1");