Существует ли решение для проблемы десериализации в NRULES в сочетании с LINQ? [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 Существует ли решение для проблемы десериализации в NRULES в сочетании с LINQ? [закрыто]

Сообщение Anonymous »

Я хотел бы управлять правилами, которые должны быть проверены с помощью NRULE в базе данных, и прочитать их динамически. Поэтому мне нужно определение правила в формате JSON.

Код: Выделить всё

public class TrafficViolationSurchargeRule : Rule
{
public override void Define()
{
InsuranceQuote quote = default!;
IEnumerable violations = default!;
int totalViolations = 0;

When()
.Match(() => quote)
.Query(() => violations, q => q
.Match()
.Where(v => v.Driver == quote.Driver,
v => v.ViolationType != "Parking",
v => v.Date >= DateTime.Now.AddYears(-2))
.Collect())
.Let(() => totalViolations, () => violations.Count())
.Having(() => totalViolations > 1);

Then()
.Do(ctx =>  quote.ApplySurcharge(20 * totalViolations));
}
}
< /code>
serializing вышеизложенное правило для формата JSON работает без каких-либо проблем и создает следующий вывод: < /p>
{
"name": "Rules.TrafficViolationSurchargeRule",
"properties": [
{
"name": "Fluent::ClrType",
"type": "System.Type",
"value": "Rules.TrafficViolationSurchargeRule, Rules, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
}
],
"leftHandSide": {
"elementType": "And",
"childElements": [
{
"elementType": "Pattern",
"name": "quote",
"type": "Domain.InsuranceQuote, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
},
{
"elementType": "Pattern",
"name": "violations",
"type": "System.Collections.Generic.IEnumerable\u00601[[Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]",
"source": {
"elementType": "Aggregate",
"name": "Collect",
"resultType": "System.Collections.Generic.IEnumerable\u00601[[Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]",
"source": {
"elementType": "Pattern",
"name": "$this$",
"type": "Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"expressions": [
{
"name": "Condition",
"expression": {
"nodeType": "Lambda",
"parameters": [
{
"name": "$this$",
"type": "Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
},
{
"name": "quote",
"type": "Domain.InsuranceQuote, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
}
],
"body": {
"nodeType": "Equal",
"left": {
"nodeType": "MemberAccess",
"memberType": "Property",
"name": "Driver",
"declaringType": "Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"expression": {
"nodeType": "Parameter",
"name": "$this$",
"type": "Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
}
},
"right": {
"nodeType": "MemberAccess",
"memberType": "Property",
"name": "Driver",
"declaringType": "Domain.InsuranceQuote, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"expression": {
"nodeType": "Parameter",
"name": "quote",
"type": "Domain.InsuranceQuote, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
}
}
}
}
},
{
"name": "Condition",
"expression": {
"nodeType": "Lambda",
"parameters": [
{
"name": "$this$",
"type":  "Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
}
],
"body": {
"nodeType": "NotEqual",
"left": {
"nodeType": "MemberAccess",
"memberType": "Property",
"name": "ViolationType",
"declaringType": "Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"expression": {
"nodeType": "Parameter",
"name": "$this$",
"type": "Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
}
},
"right": {
"nodeType": "Constant",
"type": "string",
"value": "Parking"
}
}
}
},
{
"name": "Condition",
"expression": {
"nodeType": "Lambda",
"parameters": [
{
"name": "$this$",
"type": "Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
}
],
"body": {
"nodeType": "GreaterThanOrEqual",
"left": {
"nodeType": "MemberAccess",
"memberType": "Property",
"name": "Date",
"declaringType": "Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"expression": {
"nodeType": "Parameter",
"name": "$this$",
"type": "Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
}
},
"right": {
"nodeType": "Call",
"object": {
"nodeType": "MemberAccess",
"memberType": "Property",
"name": "Now",
"declaringType": "System.DateTime"
},
"methodName": "AddYears",
"arguments": [
{
"nodeType": "Constant",
"type": "int",
"value": -2
}
]
}
}
}
}
]
}
}
},
{
"elementType": "Pattern",
"name": "totalViolations",
"type": "int",
"expressions": [
{
"name": "Condition",
"expression": {
"nodeType": "Lambda",
"parameters": [
{
"name": "totalViolations",
"type": "int"
}
],
"body": {
"nodeType": "GreaterThan",
"left": {
"nodeType": "Parameter",
"name": "totalViolations",
"type": "int"
},
"right":  {
"nodeType": "Constant",
"type": "int",
"value": 1
}
}
}
}
],
"source": {
"elementType": "Binding",
"resultType": "int",
"expression": {
"nodeType": "Lambda",
"parameters": [
{
"name": "violations",
"type": "System.Collections.Generic.IEnumerable\u00601[[Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"
}
],
"body": {
"nodeType": "Call",
"methodName": "Count",
"declaringType": "System.Linq.Enumerable, System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
"arguments": [
{
"nodeType": "Parameter",
"name": "violations",
"type": "System.Collections.Generic.IEnumerable\u00601[[Domain.TrafficViolation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"
}
]
}
}
}
}
]
},
"rightHandSide": [
{
"expression": {
"nodeType": "Lambda",
"parameters": [
{
"name": "ctx",
"type": "NRules.RuleModel.IContext, NRules.RuleModel, Version=1.0.2.0, Culture=neutral, PublicKeyToken=8ad544355a4a2176"
},
{
"name": "quote",
"type": "Domain.InsuranceQuote, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
},
{
"name": "totalViolations",
"type": "int"
}
],
"body": {
"nodeType": "Call",
"object": {
"nodeType": "Parameter",
"name": "quote",
"type": "Domain.InsuranceQuote, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
},
"methodName": "ApplySurcharge",
"arguments": [
{
"nodeType": "Convert",
"operand": {
"nodeType": "Multiply",
"left": {
"nodeType": "Constant",
"type": "int",
"value": 20
},
"right": {
"nodeType": "Parameter",
"name": "totalViolations",
"type": "int"
}
},
"type": "decimal"
}
]
}
}
}
]
}
< /code>
Сохраните этот json в файле, добавьте файл в проект и десериализуйте его со следующим кодом: < /p>
using NRules.Json;
using NRules.RuleModel;
using System.Text.Json;

var options = new JsonSerializerOptions
{
WriteIndented = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

RuleSerializer.Setup(options);

string text = File.ReadAllText("file.json");
JsonSerializer.Deserialize(text, options);
< /code>
Вы получаете следующую ошибку в «getMethod» в классе «MembereStensions», что метод «count» в «System.linq.enumerable» не может быть найдена: < /p>
System.ArgumentException
HResult=0x80070057
Nachricht = Unknown method.  DeclaringType=System.Linq.Enumerable, Name=Count
Quelle = NRules.Json
Stapelüberwachung:
bei NRules.Json.Converters.MemberExtensions.GetMethod(MethodRecord methodRecord, Type[] argumentTypes, Type impliedType) in /_/src/NRules/NRules.Json/Converters/MemberExtensions.cs: Zeile85
bei NRules.Json.Converters.ExpressionConverter.ReadMethodCall(Utf8JsonReader& reader, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Converters/ExpressionConverter.cs: Zeile226
bei NRules.Json.Converters.ExpressionConverter.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Converters/ExpressionConverter.cs: Zeile32
bei System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
bei System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, T& value, JsonSerializerOptions options, ReadStack& state)
bei System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.Deserialize(Utf8JsonReader& reader, ReadStack& state)
bei System.Text.Json.JsonSerializer.Read[TValue](Utf8JsonReader& reader, JsonTypeInfo`1 jsonTypeInfo)
bei NRules.Json.Utilities.JsonExtensions.ReadProperty[TElement](Utf8JsonReader& reader, String name, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Utilities/JsonExtensions.cs: Zeile250
bei NRules.Json.Converters.ExpressionConverter.ReadLambda(Utf8JsonReader& reader, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Converters/ExpressionConverter.cs: Zeile156
bei NRules.Json.Converters.ExpressionConverter.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Converters/ExpressionConverter.cs: Zeile24
bei System.Text.Json.Serialization.JsonConverter`1.ReadAsObject(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options)
bei System.Text.Json.Serialization.Converters.CastingConverter`1.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options)
bei System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
bei System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, T& value, JsonSerializerOptions options, ReadStack& state)
bei System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.Deserialize(Utf8JsonReader& reader, ReadStack& state)
bei System.Text.Json.JsonSerializer.Read[TValue](Utf8JsonReader& reader, JsonTypeInfo`1 jsonTypeInfo)
bei NRules.Json.Utilities.JsonExtensions.ReadProperty[TElement](Utf8JsonReader& reader, String name, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Utilities/JsonExtensions.cs: Zeile250
bei NRules.Json.Converters.RuleElementConverter.ReadBinding(Utf8JsonReader& reader, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Converters/RuleElementConverter.cs: Zeile150
bei NRules.Json.Converters.RuleElementConverter.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Converters/RuleElementConverter.cs: Zeile35
bei System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
bei System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, T& value, JsonSerializerOptions options, ReadStack& state)
bei System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.Deserialize(Utf8JsonReader& reader, ReadStack& state)
bei System.Text.Json.JsonSerializer.Read[TValue](Utf8JsonReader& reader, JsonTypeInfo`1 jsonTypeInfo)
bei NRules.Json.Utilities.JsonExtensions.TryReadProperty[TElement](Utf8JsonReader& reader, String name, JsonSerializerOptions options, TElement& value) in /_/src/NRules/NRules.Json/Utilities/JsonExtensions.cs: Zeile274
bei NRules.Json.Converters.RuleElementConverter.ReadPattern(Utf8JsonReader& reader, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Converters/RuleElementConverter.cs: Zeile165
bei NRules.Json.Converters.RuleElementConverter.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Converters/RuleElementConverter.cs: Zeile37
bei System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean&  isPopulatedValue)
bei System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, T& value, JsonSerializerOptions options, ReadStack& state)
bei System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.Deserialize(Utf8JsonReader& reader, ReadStack& state)
bei System.Text.Json.JsonSerializer.Read[TValue](Utf8JsonReader& reader, JsonTypeInfo`1 jsonTypeInfo)
bei NRules.Json.Utilities.JsonExtensions.ReadArray[TElement](Utf8JsonReader& reader, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Utilities/JsonExtensions.cs: Zeile226
bei NRules.Json.Utilities.JsonExtensions.ReadArrayProperty[TElement](Utf8JsonReader& reader, String name, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Utilities/JsonExtensions.cs: Zeile183
bei NRules.Json.Converters.RuleElementConverter.ReadGroup(Utf8JsonReader& reader, JsonSerializerOptions options, GroupType groupType) in /_/src/NRules/NRules.Json/Converters/RuleElementConverter.cs: Zeile92
bei NRules.Json.Converters.RuleElementConverter.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Converters/RuleElementConverter.cs: Zeile25
bei System.Text.Json.Serialization.JsonConverter`1.ReadAsObject(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options)
bei System.Text.Json.Serialization.Converters.CastingConverter`1.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options)
bei System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
bei System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, T& value, JsonSerializerOptions options, ReadStack& state)
bei System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.Deserialize(Utf8JsonReader& reader, ReadStack& state)
bei System.Text.Json.JsonSerializer.Read[TValue](Utf8JsonReader& reader, JsonTypeInfo`1 jsonTypeInfo)
bei NRules.Json.Utilities.JsonExtensions.ReadProperty[TElement](Utf8JsonReader& reader, String name, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Utilities/JsonExtensions.cs: Zeile250
bei NRules.Json.Converters.RuleDefinitionConverter.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options) in /_/src/NRules/NRules.Json/Converters/RuleDefinitionConverter.cs: Zeile27
bei System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
bei System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, T& value, JsonSerializerOptions options, ReadStack& state)
bei System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.Deserialize(Utf8JsonReader& reader, ReadStack& state)
bei System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan`1 utf8Json, JsonTypeInfo`1 jsonTypeInfo, Nullable`1 actualByteCount)
bei System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan`1 json, JsonTypeInfo`1 jsonTypeInfo)
bei System.Text.Json.JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options)
Это потому, что метод является методом расширения и не может быть найдена посредством отражения с текущей реализацией в «nrules.json.converters.memberextensions».>

Подробнее здесь: https://stackoverflow.com/questions/797 ... on-with-li
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»