我知道網絡上有很多這樣的例子,但是我似乎無法使它起作用。
讓我嘗試進行設置,我有一個自定義對象列表,我需要限制一系列值。
我有一個排序變量,該變量會根據UI上的某些操作而變化,因此我需要基於該變量對對象進行不同的處理。
這是我的對象:
MyObject.ID - Just an identifier
MyObject.Cost - The cost of the object.
MyObject.Name - The name of the object.
現在,我需要根據成本範圍來對此進行過濾,因此考慮到我可能會受其底部兩個屬性之一的限制,因此我將對此有所類似。
var product = from mo in myobject
where mo.Cost <= 10000
要么
var product = from mo in myobject
where mo.Name equals strName
現在,我的項目中有了動態linq,但是我沒有弄清楚如何使其真正起作用,因為當我執行一些示例時,我只會得到:
Func<Tsourse>bool> predicate
作為一種選擇。
更新:我正在嘗試尋找一種可以幫助我使代碼對象化的解決方案,因為目前它大量複製和粘貼我的linq查詢。
更新2:之間有明顯的性能差異:
var product = from mo in myobject
... a few joins ...
where mo.Cost <= 10000
和
var product = (from mo in myobject
... a few joins ...)
.AsQueryable()
.Where("Cost > 1000")
也許不直接回答您的問題,但是這裡不需要DynamicQuery。您可以將查詢寫為:
public IEnumerable<MyObject> GetMyObjects(int? maxCost, string name)
{
var query = context.MyObjects;
if (maxCost != null)
{
query = query.Where(mo => mo.Cost <= (int)maxCost);
}
if (!string.IsNullOrEmpty(name))
{
query = query.Where(mo => mo.Name == name);
}
return query;
}
如果條件是互斥的,則只需將第二個if
更改為else if
。
我一直在使用這種模式。 “動態查詢”的真正含義是將純SQL與Linq相結合。即時生成條件並沒有真正幫助您。
using System.Linq;
var products = mo.Where(x => x.Name == "xyz");
var products = mo.Where(x => x.Cost <= 1000);
var products = mo.Where(x => x.Name == "xyz" || x.Cost <= 1000);