У меня есть групповой класс, содержащий элементы, которые могут относиться к разным типам классов.
Все остальные функции, связанные с этим, работают, мне не хватает только вызова базы данных, который я запустил нет идей.
Мой код выглядит следующим образом:
response = group.MapEntity(); //Irrelevant for this question (kept due to comment about it).
var resourceType = group.GetResourceType();
var functionType = typeof(Func).MakeGenericType(typeof(IGroupMember), typeof(bool));
var expressionType = typeof(Expression).MakeGenericType(functionType);
var contextSetMethod = _context.GetType().GetMethod("Set", genericParameterCount: 1, Array.Empty())!.MakeGenericMethod(resourceType);
var dbSetMethod = typeof(Enumerable).GetMethods().FirstOrDefault(x => x.Name == "SingleOrDefault")!.MakeGenericMethod(expressionType);
var dynamicContext = contextSetMethod.Invoke(_context, null);
foreach (var member in group.Members)
{
var func = BuildExpression(member.MemberId);
var result = dbSetMethod.Invoke(dynamicContext, new object?[] { func });
if (result is null || result.GetType() != resourceType)
throw new Exception($"Something went wrong!!!!! {result}");
members.Add((IGroupMember)result);
}
response.Members = members;
Исключение возникает при dbSetMethod.Invoke(...)
Исключение:
System.ArgumentException: объект типа «System.Linq.Expressions.Expression1»1[System.Func'2[Trasolu.Domain.Common.IGroupMember,System.Boolean]]» невозможно преобразовать в введите 'System.Collections.Generic.IEnumerable'1[System.Linq.Expressions.Expression'1[System.Func`2[Trasolu.Domain.Common.IGroupMember,System.Boolean]]]'.
Я хочу сделать динамический вызов базы данных, функция в цикле представляет собой лямбда-выражение, которое я хочу запустить в dbSetMethod , чтобы убедиться, что я получаю только объект с заданным идентификатором.
Это моя функция, которую я пытаюсь запустить.
private Func BuildExpression(int id)
{
Expression queryFunction = x => x.Id;
var paramExpr = Expression.Parameter(typeof(IGroupMember));
var varExpr = Expression.Constant(id, typeof(int));
var equalExpr = Expression.Equal(
left: Expression.Invoke(queryFunction, paramExpr),
right: varExpr);
var lambda = Expression.Lambda(equalExpr, paramExpr);
return lambda.Compile();
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... abase-call