我知道网络上有很多这样的例子,但是我似乎无法使它起作用。
让我尝试进行设置,我有一个自定义对象列表,我需要限制一系列值。
我有一个排序变量,该变量会根据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);