【问题标题】:Dynamicaly build linq to objects where expression动态构建 linq 到表达式的对象
【发布时间】:2015-01-30 07:43:02
【问题描述】:

专家!

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

我有一个对象:

   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 是 Dictionary 项目的值类型,参数 field 的键DataItem.Values 字典和 value 是这个键的值。

但这里有一个问题:

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

    p => p.Values.ContainsKey(field) && p.Values[field] >= value

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

另外,我将非常感谢您提供一些不错的教程和链接,其中包含 “易于理解” 示例。

【问题讨论】:

    标签: c# linq where


    【解决方案1】:

    你能像这样在查询中添加 .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; }
    }
    

    【讨论】:

    • 这无济于事,因为字典包含许多不同类型的对象。你基本上给了他们一个单一的类型。
    【解决方案2】:

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

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

    【讨论】:

    • 这是一个非常接近的解决方案,我可以接受 :) 对此做了一个很大的包装,但由于它是官方和受支持的解决方案,所以它对我来说更完美。非常感谢,伙计。
    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多