[英]Dynamic where clause in LINQ to Objects
我知道网络上有很多这样的例子,但是我似乎无法使它起作用。
让我尝试进行设置,我有一个自定义对象列表,我需要限制一系列值。
我有一个排序变量,该变量会根据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相结合。 即时生成条件并没有真正帮助您。
阅读ScottGu在DLINQ上发表的精彩文章
您将需要类似
var product = myobject.Where("Cost <= 10000");
var product = myobject.Where("Name = @0", strName);
如果下载了样本,则需要在样本中找到Dynamic.cs
文件。 您需要将此文件复制到项目中,然后using System.Linq.Dynamic;
添加using System.Linq.Dynamic;
到您要在其中使用Dynamic Linq的类。
编辑:回答您的编辑。 是的,当然会有性能差异。 如果您事先知道过滤器的变体,那么我建议您不使用DLINQ将它们写出来。
您可以像这样创建自己的扩展方法。
public static class FilterExtensions
{
public static IEnumerable<T> AddFilter<T,T1>(this IEnumerable<T> list, Func<T,T1, bool> filter, T1 argument )
{
return list.Where(foo => filter(foo, argument) );
}
}
然后创建您的过滤方法。
public bool FilterById(Foo obj, int id)
{
return obj.id == id;
}
public bool FilterByName(Foo obj, string name)
{
return obj.name == name;
}
现在,您可以非常容易地在IEnumerable<Foo>
上使用它。
List<Foo> foos = new List<Foo>();
foos.Add(new Foo() { id = 1, name = "test" });
foos.Add(new Foo() { id = 1, name = "test1" });
foos.Add(new Foo() { id = 2, name = "test2" });
//Example 1
//get all Foos's by Id == 1
var list1 = foos.AddFilter(FilterById, 1);
//Example 2
//get all Foo's by name == "test1"
var list2 = foos.AddFilter(FilterByName, "test1");
//Example 3
//get all Foo's by Id and Name
var list1 = foos.AddFilter(FilterById, 1).AddFilter(FilterByName, "test1");
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.