动态构建 linq to objects where expression

Dynamicaly build linq to objects where expression

专家!

遇到一个(对某些人来说可能很简单)问题。

我有一个对象:

   public class DataItem {
        public string Title { get; set; }
        public string ID { get; set; }
        public Dictionary<String, Object> Values { get; set; }
   }

我需要做的是从 "Caml like" Xml 动态构建 linq .Where。在 Xml 解析中,我使用 switch 作为条件来构建 linq 谓词:

switch (Type) {
  case CriteriaType.Contains:
  break;
  case CriteriaType.Eq:
  break;
...

并使用 PredicateBuilder(来自 C# 5.0/4.0 in a Nutshell)来组合表达式,但问题是我不知道如何构建表达式谓词,例如大于或等于。 想法是具有如下功能:

public Expression<Func<DataItem, bool>> Geq<T>(String field, Object value)

其中DataItem是我们要查询的对象,T是字典项值类型,参数字段DataItem.Values 字典中的键,value 是这个键的值。

但问题是:

如果有人能帮我解决这个问题,那就太棒了。

此外,我将非常感谢一些不错的教程和带有 "easy to understand" 示例的链接。

你能像这样在查询中添加 .Where 子句吗?

// query
var query = from d in dataItems select d;

switch (expressionType) {
    case CriteriaType.Contains:
        query = query.Where(d => d.Values.ContainsKey(field));
    break;
    case CriteriaType.Eq:
        query = query.Where(d => d.Values[field] >= value);
    break;

此外,我不确定我是否理解您 "Since we're operating with objects they should be converted to type" 的意思,但也许您可以将 DataItem class 重新定义为通用的:

public class DataItem<T> {
    public string Title { get; set; }
    public string ID { get; set; }
    public Dictionary<string, T> Values { get; set; }
}

@Silverlay 我认为您正在寻找的是 Dynamic LINQ。这是LINQ团队自己提供的库

您需要做的是改用字符串表达式,如本博客所示 - http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library