不能让动态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问题似乎建议。谁能帮我看看我错过了什么,使这项工作?

它不产生和错误,它只是没有返回任何数据

不能让动态Linq工作

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();