У меня был следующий код, и я хочу заменить тип Отдела на универсальный тип ...
Я бы хотел заменить ...
Expression.Lambda<Func<Department, bool>>(body, param)
на ..
Expression.Lambda<Func<T, bool>>(body, param)
Я знаю, что должен использовать отражение, но все, что у меня есть, это класс модели предметной области, помеченный в качестве объекта.
Я мог бы получить объект и имя его типа, но у меня возникли трудностизаменить жестко запрограммированный тип Department на общий тип.
Я не могу преобразовать метод Exists
в Exists<T>
, потому что я не знаю, что такое <T>
во время вызова метода.У меня есть только объект.
public bool Exists(object id, object source, Type type)
{
var param = Expression.Parameter(type, "e");
var body = Expression.Equal(Expression.Property(param, "Id", Expression.Constant(id));
var where = Expression.Lambda<Func<Department, bool>>(body, param);
var context = new DataContext();
var dbSet = context.Set<Department>();
return dbSet.AsNoTracking().Any(where);
}
Для случая dbset я попробовал следующий код
public static IQueryable<object> Set (this DbContext context, Type type)
{
return IQueryable<object>)context.GetType().GetMethod("Set")?.MakeGenericMethod(type).Invoke(context, null);
}
и заменил ...
var dbSet = context.Set<Department>();
на
var dbSet = context.Set(type);
Кажется, это работает, я получил правильный dbset, но есть некоторые проблемы с предложением where, которое выдает некоторые ошибки во время выполнения.
Чего я пытаюсь добиться, так это избегать EF Core, чтобысделать оценку на стороне клиента.Т.е.
Any(e => e.ToString == id.ToString())
это будет работать, но будет выполнять нежелательную оценку на стороне клиента.