动态LINQ查询

时间:2009-11-07 16:12:49

标签: c# .net linq-to-objects

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

3 个答案:

答案 0 :(得分:4)

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

  • 学习Expression API
  • 使用预先滚动的动态LINQ库(来自样本下载)

如果你想要第一个选项,那么你需要创建自己的lambdas;想象一下,例如,你有类似的事情(在这里制造......):

<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会在循环中受到限制。

答案 1 :(得分: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);
}

答案 2 :(得分:0)

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