动态构建linq到表达式的对象

时间:2015-01-30 07:43:03

标签: c# linq where

专家!

坚持使用一个(可能对某人来说很简单)问题。

我有一个对象:

   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 dynamicaly。在Xml解析时,我使用switch来条件来构建linq谓词:

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

并使用 PredicateBuilder (来自C# 5.0/4.0 in a Nutshell)来组合表达式,但事情是我不知道如何构建表达式谓词,例如GreaterOrEqual。 想法的功能如下:

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

DataItem 是我们要查询的对象, T 是字典项值类型,参数字段的关键字DataItem.Values 字典和是此键的值。

但是这里有一个问题:

  • 由于我们使用对象操作,因此应将其转换为类型 。
  • 因为我们不确定DataItem.Values集合是否具有密钥 我们需要,表达式应该构建为linq等价于

    p =&gt; p.Values.ContainsKey(field)&amp;&amp; p.Values [ field ]&gt; =

如果有人可以帮助我,那就太棒了。

另外,我会非常感谢一些很好的教程和链接“易于理解”的示例。

2 个答案:

答案 0 :(得分:2)

你能在这样的问题中添加.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;

另外,我不确定我理解你的意思“因为我们使用对象操作它们应该转换为类型”,但也许你可以重新定义你的DataItem类是通用的:

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

答案 1 :(得分:1)

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

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