Как получить Expression.Lambda> универсальный - PullRequest
0 голосов
/ 09 октября 2018

У меня был следующий код, и я хочу заменить тип Отдела на универсальный тип ...

Я бы хотел заменить ...

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())

это будет работать, но будет выполнять нежелательную оценку на стороне клиента.

1 Ответ

0 голосов
/ 09 октября 2018

Я не могу преобразовать метод Exists в Exists<T>, потому что я не знаю, что такое <T> во время вызова метода.У меня есть только object.

. Здесь дженерики могут помочь с генерацией динамического лямбда-выражения.

public class MyEntity
{
    public int Id { get; set; }
}

public class muckingabout
{
    public bool Exists<T>(T myentity) where T: MyEntity
    {
        var type = typeof(T);
        //e =>
        var param = Expression.Parameter(type, "e");
        //e => e.Id    
        var property = Expression.Property(param, "Id");
        var value = Expression.Constant(myentity.Id);
        //e => e.Id == myentity.Id
        var body = Expression.Equal(property, value);
        var lambda = Expression.Lambda<Func<T, bool>>(body, param);

        using (var context = new DbContext())
        {
           var dbSet = context.Set<T>();
           return dbSet.AsNoTracking().Any(lambda);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...