不能让动态Linq工作
本文关键字:工作 Linq 动态 不能 | 更新日期: 2023-09-27 18:17:08
我正在尝试使用动态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问题似乎建议。谁能帮我看看我错过了什么,使这项工作?
它不产生和错误,它只是没有返回任何数据
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
类中使用静态方法构建表达式:
//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库(其最新版本可以在这里找到)允许使用字符串生成表达式:
IQueryable<FactSales> qry;
qry = qry.Where("DateKey >= @0", startDate);
动态LINQ在编译时不知道表达式时非常有用,但是在这种情况下,表达式在编译时是已知的(在这种情况下,使用List<T>.Contains
方法)。因此,我不认为有任何理由在这里使用动态LINQ。
注意:我仍然不知道为什么这不起作用:
var qry = dashboardEntity.FactSales.Where("StoreID = 1");
我不知道你是否整理好了,但我刚刚注意到你对我评论的回复。
我认为你在比较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();