我正在尝试使用Dynamic Linq库来查询我的实体框架数据源。我已将正确的包添加到我的项目中并使用了以下语法
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博客文章中发现的示例,大多数动态查询SO问题似乎都表明了这一点。任何人都可以帮我看看我缺少什么来使这项工作?
它没有产生和错误,它根本无法返回任何数据。
答案 0 :(得分:2)
<强> TL; DR 强>
您确定需要动态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");
答案 1 :(得分:0)
如果您对此进行了整理,我会注意到您对我的评论的回复。
在比较=
时,我认为您遗失的是==
而不是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();