无法让Dynamic Linq工作

时间:2016-11-10 05:22:23

标签: c# entity-framework linq dynamic-linq

我正在尝试使用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问题似乎都表明了这一点。任何人都可以帮我看看我缺少什么来使这项工作?

它没有产生和错误,它根本无法返回任何数据。

2 个答案:

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