2016-11-10 62 views
2

我正在嘗試使用動態Linq庫來查詢我的實體框架數據源。我加入了正確的包我的項目和已經使用的語法如下無法使動態Linq工作

var salesEntities = dashboardEntity.FactSales.Where(d => d.DateKey >= startDate).Where(d => d.DateKey <= endDate) 
            .Where(c => c.CompanyID == companyID) 
            .Where("[email protected]",1) 
            .ToList(); 

我也曾嘗試

.Where("StoreID=1") 

基於我對ScottGu博客文章中的例子,大多數動態查詢SO問題似乎表明。任何人都可以幫助我看到我失去了什麼使這項工作?

它does not產生和錯誤它只是無法返回任何數據。

+0

我剛剛創建了一個簡單的測試示例,我需要使用Dynamic Linq的原因是因爲用戶需要能夠選擇一個或多個存儲區在運行時動態查看,這就是StoreID的.Where()與其他人分離的原因。 – Nate58

+0

最後一次檢查linq時,它不支持這種語法。您可能需要構建自己的謂詞...謂詞基本上用於創建動態查詢......像多過濾器搜索一樣認爲是可能的場景。這是一個很好的例子:http://www.c-sharpcorner.com/UploadFile/c42694/dynamic-query-in-linq-using-predicate-builder/... C#6.0已經有一個PredicateBuilder,可能要檢查。 –

+0

你可以試試'.Where(s => s.StoreID == 1)'?它是否返回數據? – uTeisT

回答

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。因此我沒有看到任何理由在這裏使用動態LINQ。

N.B.我仍然不知道爲什麼這不起作用:

var qry = dashboardEntity.FactSales.Where("StoreID = 1"); 
+0

謝謝,我從來不知道.Contains的功能,這是一個很大的幫助! – Nate58

+0

@NateGreene我已經擴展了我的答案。 –

0

Idk如果你整理了這一點,但我只是注意到你的回覆我的評論。

我想你缺少的是=而不是==,而比較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();