C# LINQ to对象中的动态where子句

C# LINQ to对象中的动态where子句,c#,linq,linq-to-objects,dynamic-linq,C#,Linq,Linq To Objects,Dynamic Linq,我知道网络上有很多这样的例子,但我似乎无法让它发挥作用 让我试着设置一下,我有一个自定义对象的列表,我需要限制一个值范围 我有一个排序变量,它会根据用户界面上的某些操作而改变,我需要基于此对对象进行不同的处理 这是我的目标: MyObject.ID - Just an identifier MyObject.Cost - The cost of the object. MyObject.Name - The name of the object. 现在,我需要根据成本的范围对其进行过滤,因此我

我知道网络上有很多这样的例子,但我似乎无法让它发挥作用

让我试着设置一下,我有一个自定义对象的列表,我需要限制一个值范围

我有一个排序变量,它会根据用户界面上的某些操作而改变,我需要基于此对对象进行不同的处理

这是我的目标:

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
现在我的项目中有了动态linq,但我不知道如何让它实际工作,因为当我做一些示例时,我只得到:

Func<Tsourse>bool> predicate

请阅读ScottGu在DLINQ上发表的这篇文章

你需要像这样的东西

var product = myobject.Where("Cost <= 10000");
var product = myobject.Where("Name = @0", strName);
然后创建过滤方法

        public bool FilterById(Foo obj, int id)
        {
            return obj.id == id;
        }

        public bool FilterByName(Foo obj, string name)
        {
            return obj.name == name;
        }
现在,您可以非常轻松地在
IEnumerable
上使用它

    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");
List foos=new List();
Add(newfoo(){id=1,name=“test”});
Add(newfoo(){id=1,name=“test1”});
Add(newfoo(){id=2,name=“test2”});
//例1
//通过Id==1获取所有foo
var list1=foos.AddFilter(FilterById,1);
//例2
//按名称获取所有Foo==“test1”
var list2=foos.AddFilter(FilterByName,“test1”);
//例3
//按Id和名称获取所有Foo
var list1=foos.AddFilter(FilterById,1).AddFilter(FilterByName,“test1”);

请阅读ScottGu在DLINQ上发表的这篇文章

你需要像这样的东西

var product = myobject.Where("Cost <= 10000");
var product = myobject.Where("Name = @0", strName);
然后创建过滤方法

        public bool FilterById(Foo obj, int id)
        {
            return obj.id == id;
        }

        public bool FilterByName(Foo obj, string name)
        {
            return obj.name == name;
        }
现在,您可以非常轻松地在
IEnumerable
上使用它

    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");
List foos=new List();
Add(newfoo(){id=1,name=“test”});
Add(newfoo(){id=1,name=“test1”});
Add(newfoo(){id=2,name=“test2”});
//例1
//通过Id==1获取所有foo
var list1=foos.AddFilter(FilterById,1);
//例2
//按名称获取所有Foo==“test1”
var list2=foos.AddFilter(FilterByName,“test1”);
//例3
//按Id和名称获取所有Foo
var list1=foos.AddFilter(FilterById,1).AddFilter(FilterByName,“test1”);

可能不会直接回答您的问题,但此处不需要动态查询。您可以将此查询编写为:

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;
}
public IEnumerable GetMyObject(int?maxCost,字符串名)
{
var query=context.MyObjects;
if(maxCost!=null)
{
查询=查询。其中(生产任务=>生产任务成本生产任务名称==名称);
}
返回查询;
}
如果条件相互排斥,则只需将第二个
If
更改为
else If


我一直在用这个图案。“动态查询”的真正含义是将纯SQL与Linq相结合;在动态生成条件方面,它对您没有多大帮助。

可能不会直接回答您的问题,但这里不需要动态查询。您可以将此查询编写为:

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;
}
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);
public IEnumerable GetMyObject(int?maxCost,字符串名)
{
var query=context.MyObjects;
if(maxCost!=null)
{
查询=查询。其中(生产任务=>生产任务成本生产任务名称==名称);
}
返回查询;
}
如果条件相互排斥,则只需将第二个
If
更改为
else If

我一直在用这个图案。“动态查询”的真正含义是将纯SQL与Linq相结合;在动态生成条件方面,它对您没有多大帮助。

使用System.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);
var products=mo.Where(x=>x.Name==“xyz”); var products=mo.Where(x=>x.Cost x.Name==“xyz”| | x.Cost
使用System.Linq;
var products=mo.Where(x=>x.Name==“xyz”);


var products=mo.Where(x=>x.成本x.名称==“xyz”| | x.成本不在哪里mo.成本您是否使用
System.Linq.Dynamic添加到了中?不在哪里mo.成本您是否使用将添加到了中?请阅读我的问题,我说我的项目中有这个功能,但无法让它实际工作。这是因为您需要实际使用DLINQ扩展方法.这是什么意思?如果我明白我做错了什么,我就不会在这里问了。如果是的话,就是使用。正如我所说的,每次我输入那个…我都会得到Func@Clarence,这是因为如果您查看源代码,您将看到扩展方法都扩展了
IQueryable
,而不是
IEnumerable
,这就是您这样做的原因除非使用
AsQueryable(),否则无法查看这些方法
method。阅读我的问题,我说我的项目中有这个,但无法让它实际工作。那是因为你需要实际使用DLINQ扩展方法。这意味着什么?如果我理解我做错了什么,我就不会在这里问。如果是,就使用。正如我所说的,每次我键入它…我都会得到Func@Clarence是的因为如果您查看源代码,您将看到扩展方法都扩展了
IQueryable
,而不是
IEnumerable
,这就是为什么您没有看到这些方法,除非您使用
AsQueryable()
方法。我想我只是使用了那些
中的
作为例子,我想他的意思是他可能有很多不同的过滤器。@Stan:不管有多少不同的过滤器,你都可以以这种方式无限期地建立表达式。在引擎盖下,这正是从x到y写一个常规
queryy表达式可以,但没有条件。DynamicQuery仅在您需要将查询编写为字符串时使用;如果您使用的是lambda表达式,则不需要它。@Aaronaught,您不能继续编写许多不同的筛选器,因为可能有大量的变体。假设您有5个字段,其中包含200多个可能的筛选器combination's.@Stan:如果你有5个字段,那就是5个
If
语句。可能的组合数量并不重要——即使有,DynamicQuery会有什么帮助