能否在运行时创建Linq查询呢?使用可转换为Linq查询的xml规则。
最终答案是肯定的;但这并不简单,你需要:
如果你选择第一种方法,那么你需要创建自己的 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
通过循环变得受限。
是的。我不打算向您展示如何解析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);
}