代码之家  ›  专栏  ›  技术社区  ›  StevenzNPaul

动态LINQ查询

  •  3
  • StevenzNPaul  · 技术社区  · 15 年前

    是否可以在运行时创建LINQ查询。 使用可以转换为LINQ查询的XML规则。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Marc Gravell    15 年前

    最终,是的,但这并不简单,你需要:

    • 学习表达式api
    • 使用预卷动态LINQ库(从示例下载)

    如果你想选择第一个选项,那么你需要创建你自己的lambda;例如,想象一下你有这样的东西(在这里编东西…):

    <Filters>
        <Add Prop="Foo">My filter value</Add>
    </Filters>
    

    然后你需要做如下的事情:

    XElement filters = ...; // the "Filters" element
    IQueryable<Customer> query = ...; // your raw (unfiltered) query
    foreach(var filter in filters.Elements("Add")) {
        var param = Expression.Parameter(typeof(Customer), "row");
        var body = Expression.Equal(
            Expression.PropertyOrField(param, (string)filter.Attribute("Prop")),
            Expression.Constant(filter.Value, typeof(string)));
        query = query.Where(Expression.Lambda<Func<Customer, bool>>(
            body, param));
    }
    

    上面(对于每个“add”元素)创建一个lambda,它将给定成员过滤为提供的值(假定为字符串,但您当然可以进行任何转换等)。所有其他操作都是可用的,但这显示了最小的效果。注意 query 通过循环受到限制。

        2
  •  0
  •   John Gietzen    15 年前

    对。我不会向您演示如何解析XML,但是您可以附加这样的LINQ扩展方法:

    var IQueryable<bla> query = myDataContext.BlahTable;  // I think you can also use IEnumerable.
    
    if(/* something */)
    {
        query = query.Where(b => b.Field1 > 0);
    }
    
    if(/* something else */)
    {
        query = query.OrderBy(b => b.Field2);
    }
    
        3
  •  0
  •   Community Mofi    7 年前

    实际上,您需要构建一个表达式树。这里有一个简短的解释来回答另一个关于 creating expression trees from XML .