动态 LINQ 查询

3
能否在运行时创建Linq查询呢?使用可转换为Linq查询的xml规则。

你可以使用动态 Linq - Rik
3个回答

4

最终答案是肯定的;但这并不简单,你需要:

  • 学习 Expression 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通过循环变得受限。


0

是的。我不打算向您展示如何解析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);
}

除了上述问题,我需要在运行时构建Linq查询以解析XML规则,同时查询可以根据XML规则是复杂还是简单而有所不同。 - StevenzNPaul

0

基本上你需要构建一个表达式树。这里有一个简短的解释,作为另一个关于从XML创建表达式树问题的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接