繁体   English   中英

如何将特定字典条目添加到 Linq 表达式?

[英]How can I add a specific dictionary entry to a Linq Expression?

我正在使用dynamic-linq-query-builder库,并试图从查询的 JSON 表示生成可执行的 Linq 查询。 我不相信这个库支持字典,所以我希望添加这个功能。

我的 JSON 如下所示:

{
  "condition": "AND",
  "rules": [
    {
      "id": "Field_1",
      "field": "Data[\"Field_1\"].StringValue",
      "type": "string",
      "input": "text",
      "operator": "equal",
      "value": "test"
    }
  ],
  "valid": true
}

我正在尝试生成这样的 Linq 查询:

.Where(p => p.Data["Field_1"].StringValue == "test")

我真的很想知道如何生成一个System.Linq.Expressions.Expression来代表树的这个有效硬编码的字典项( Data["Field_1"] )部分。

我已经阅读了很多文章,并查看了这个 StackOverflow 问题how-do-i-access-a-dictionary-item-using-linq-expressions但解决方案仍然在逃避我。

任何人都可以指出我正确的方向吗? 问题是体现在BuildNestedExpression()的方法类。

提前致谢。

更新 13/12/19

我在这方面取得了一些进展,但感觉我正在迅速失去理智。 如前所述,问题体现在BuildNestedExpression()方法中,该方法目前不支持字典属性。 我正在尝试添加对此的支持。

我很感激我的代码可以大大改善(只是想获得它最初的工作),但我的变化是在GitHub上这里

我做了一个变化,打破了的BuildNestedExpression()如果我找到一个字典到我的新方法BuildElementAccessExpression() 在这里,我只是尝试将任何字典条目添加到为属性构建的表达式中。 不过,我在这个过程中感到非常困惑(正如您可以从注释掉的代码中看出的那样)。

我添加了一个快速单元测试来说明问题( Dictionary_Test )。

我不会在这里发布大量代码,因为它在 GitHub 中可用。 任何帮助都会很棒,不要以为我会自己解决这个问题。

我最终遇到了这个问题。 这个过程让我有点头疼,但可以在下面找到创建表达式的工作代码片段。

希望这会在将来为某人节省一些时间。

感谢您对@NetMage 的所有帮助。

var propertyInfo = expression.Type.GetProperty("Data");
var propertyExpression = Expression.Property(expression, propertyInfo);

var dictionaryKeyValue = "dictionaryEntryKey";
var dictionaryKeyConst = Expression.Constant(dictionaryKeyValue);

var dictionary = propertyType.GetInterface("IDictionary`2");
PropertyInfo indexerProperty = dictionary.GetProperty("Item");

var indexExpression = Expression.MakeIndex(propertyExpression, indexerProperty, new[] { dictionaryKeyConst });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM