У меня есть групповой класс, содержащий элементы, которые могут относиться к разным типам классов.
Все остальные функции, связанные с этим, работают, мне не хватает только вызова базы данных, который я запустил нет идей.
Мой код выглядит следующим образом:
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
Исключение при попытке сделать динамический вызов базы данных ⇐ C#
Место общения программистов C#
-
Anonymous
1719233790
Anonymous
У меня есть групповой класс, содержащий элементы, которые могут относиться к разным типам классов.
Все остальные функции, связанные с этим, работают, мне не хватает только вызова базы данных, который я запустил нет идей.
Мой код выглядит следующим образом:
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();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78662173/exception-when-trying-to-make-a-dynamic-database-call[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия