2009-11-07 115 views

回答

4

最终,是的;但它不是简单的,你会需要:

  • 学习表达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)); 
} 

以上(每个“添加“元素)创建一个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); 
} 
+0

除了上面的问题,我还需要在运行时构建解析xml规则的Linq Queries,并且根据xml规则查询可能很复杂或简单。 – StevenzNPaul 2009-11-07 16:26:26