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

C# 如何将特定词典条目添加到Linq表达式?,c#,linq,linq-expressions,dynamic-linq,C#,Linq,Linq Expressions,Dynamic Linq,我正在利用这个库,并试图从查询的JSON表示生成一个可执行的Linq查询。我认为这个库目前不支持字典,所以我希望添加这个功能 我的JSON如下所示: { "condition": "AND", "rules": [ { "id": "Field_1", "field": "Data[\"Field_1\"].StringValue", "type": "string", "input": "text", "operato

我正在利用这个库,并试图从查询的JSON表示生成一个可执行的Linq查询。我认为这个库目前不支持字典,所以我希望添加这个功能

我的JSON如下所示:

{
  "condition": "AND",
  "rules": [
    {
      "id": "Field_1",
      "field": "Data[\"Field_1\"].StringValue",
      "type": "string",
      "input": "text",
      "operator": "equal",
      "value": "test"
    }
  ],
  "valid": true
}
.Where(p => p.Data["Field_1"].StringValue == "test")
我试图生成一个Linq查询,如下所示:

{
  "condition": "AND",
  "rules": [
    {
      "id": "Field_1",
      "field": "Data[\"Field_1\"].StringValue",
      "type": "string",
      "input": "text",
      "operator": "equal",
      "value": "test"
    }
  ],
  "valid": true
}
.Where(p => p.Data["Field_1"].StringValue == "test")
我真的在为如何生成一个
System.Linq.Expressions.Expression
而苦苦挣扎,它代表了树中有效地硬编码的字典项(数据[“Field_1”])

我已经读了很多文章,并研究了这个StackOverflow问题,但我仍然没有找到解决方案

谁能给我指出正确的方向吗?问题表现在类的
BuildNestedExpression()
方法中

提前谢谢

19年12月13日更新

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

我很感激我的代码可以得到很大的改进(只是尝试让它在最初工作),但我的更改是在GitHub中进行的

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

我添加了一个快速单元测试来说明这个问题(
Dictionary\u test


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

我最终解决了这个问题。这个过程有点伤了我的头,但是创建表达式的代码片段可以在下面找到

希望这能在将来节省一些时间

感谢您对@NetMage的所有帮助

var-propertyInfo=expression.Type.GetProperty(“数据”);
var propertyExpression=Expression.Property(Expression,propertyInfo);
var dictionaryKeyValue=“dictionaryEntryKey”;
var dictionaryKeyConst=表达式.常量(dictionaryKeyValue);
var dictionary=propertyType.GetInterface(“IDictionary`2”);
PropertyInfo indexerProperty=dictionary.GetProperty(“项”);
var indexExpression=Expression.MakeIndex(propertyExpression,indexerProperty,new[]{dictionaryKeyConst});

那么您正试图构建动态linq子句?看这里:我建议使用LINQPad及其
Dump
方法来检查编译器生成的
表达式
树(例如
Expression f=p=>p.Data[“Field_1]”。StringValue==“test”
然后
f.Dump();
)。如果这样做,您将发现
字典
索引器是一个属性,它使用名为
get_Item(string key)
的方法获取
TKey
参数(在本例中为
string
),以获取访问权限。感谢@NetMage,这非常有用,也很有意义。我将下载LINQPad,看看它能帮我什么忙。@Bob在阅读您链接的SO问题时,使用
上的属性访问,似乎它也能按以下方式工作(尽管不是编译器所做的)?