0

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

让我尝试进行设置,我有一个自定义对象列表,我需要限制这些对象的值范围。

我有一个排序变量,它会根据 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")
4

3 回答 3

2

也许不会直接回答您的问题,但这里不需要 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;
}

如果条件是互斥的,那么只需将第二个更改ifelse if.

我一直使用这种模式。“动态查询”的真正含义是将纯 SQL 与 Linq 相结合;它并不能真正帮助您即时生成条件。

于 2010-01-08T15:29:53.027 回答
1
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);
于 2010-01-08T15:31:29.017 回答
1

阅读 ScottGu 在 LINQ 上的这篇精彩文章

动态 LINQ(第 1 部分:使用 LINQ 动态查询库)

你需要类似的东西

var product = myobject.Where("Cost <= 10000");
var product = myobject.Where("Name = @0", strName);

如果您下载了示例,您需要Dynamic.cs在示例中找到该文件。您需要将此文件复制到您的项目中,然后添加 using System.Linq.Dynamic;到您尝试在其中使用 Dynamic Linq 的类中。

编辑:回答您的编辑。是的,当然存在性能差异。如果您事先知道过滤器的变化,那么我建议您在不使用 LINQ 的情况下将它们写出来。

您可以像这样创建自己的扩展方法。

 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");
于 2010-01-08T15:10:54.487 回答