如何将特定字典条目添加到 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"])部分。

我看了很多文章,也看了这个 Whosebug 的问题how-do-i-access-a-dictionary-item-using-linq-expressions,但解决方案仍然在躲避我。

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

提前致谢。

19 年 12 月 13 日更新

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

我很感激我的代码可以得到很大的改进(只是试图让它开始工作),但我的变化是 GitHub here

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

我添加了一个快速单元测试来说明问题 (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 });