如何将特定字典条目添加到 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 });
我正在使用 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 });