将条件与JSON数据中的属性名称和值匹配

时间:2015-11-08 09:06:18

标签: json vb.net linq

假设我在SQL数据库中有一个包含这种结构规则的表:

Rule         Conditions                                 Action
------------`------------------------------------------ ---------------------
1            {"country": "USA", "state": "NY"}          DoActionOne
2            {"country": "France", "department": "55"}  DoActionTwo

这些规则适用于我的用户。因此,州,国家,部门是我可以在我的用户或用户地址定义中找到的属性。但这些规则可能是另一回事。它可以是我的用户创建日期或我现在不期望的事情。

如何加载此条件字符串并使用我的用户评估每个规则,每个条件?我知道如何从我的数据库中检索数据。我使用Entity Framework但我不知道如何在查询或JSON对象中转换字符串。

'NOT TESTED
For Each rule As Rule In dbContext.rules
    'Load condition one
    Dim condition = rule.Conditions.???
    If (MyUser[condition.Name] = condition.Value)
        ' DoAction
    End If
Next

1 个答案:

答案 0 :(得分:0)

您可以使用一点Reflection来实现此目的。

我们假设这是你的UserAddress

public class UserAddress
{
    public string Country { get; set; }
    public string State { get; set; }
    public int Department { get; set; }
    //other properties
}

然后,假设您已经正确阅读JSON并将规则列表作为字符串对(例如“country”&“France”,“department”&“55”等),您可以将规则检查代码编写为

var userAdd = new UserAddress { Country = "France", Department = 55, State = "SomeState" };
bool allRulesChecked = true;
foreach (var rule in rules)
{
    var property = typeof(UserAddress).GetProperty(rule.Key, System.Reflection.BindingFlags.IgnoreCase | 
                                System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Instance);
    if (property != null && property.GetValue(userAdd).ToString() != rule.Value.ToString())
    {
        allRulesChecked = false;
        break;
    }
}

请注意,对于复杂类型,它无法正常工作。