是否可以在运行时创建Linq查询。 使用可以转换为Linq查询的xml规则。
答案 0 :(得分:4)
最终,是的;但这并不简单,你需要:
如果你想要第一个选项,那么你需要创建自己的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的问题的答案。