C# 如何将特定词典条目添加到Linq表达式?
我正在利用这个库,并试图从查询的JSON表示生成一个可执行的Linq查询。我认为这个库目前不支持字典,所以我希望添加这个功能 我的JSON如下所示: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
{
"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问题时,使用项
上的属性访问,似乎它也能按以下方式工作(尽管不是编译器所做的)?