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");
我剛剛創建了一個簡單的測試示例,我需要使用Dynamic Linq的原因是因爲用戶需要能夠選擇一個或多個存儲區在運行時動態查看,這就是StoreID的.Where()與其他人分離的原因。 – Nate58
最後一次檢查linq時,它不支持這種語法。您可能需要構建自己的謂詞...謂詞基本上用於創建動態查詢......像多過濾器搜索一樣認爲是可能的場景。這是一個很好的例子:http://www.c-sharpcorner.com/UploadFile/c42694/dynamic-query-in-linq-using-predicate-builder/... C#6.0已經有一個PredicateBuilder,可能要檢查。 –
你可以試試'.Where(s => s.StoreID == 1)'?它是否返回數據? – uTeisT