Создать динамическое выражение <Func <T, bool >> - PullRequest
0 голосов
/ 29 октября 2018

Я не знаю, возможно ли это или нет, но я пытаюсь реорганизовать мою логику кода, выполнив следующее:

У меня есть метод с именем: ApproveProcess<T1, T2>(T1 classObject, T2 classSecondObject) where T : class

T - это общий объект, который я передаю методу ApproveProcess. У меня есть тогда следующий метод:

public IQueryable<T> GetById(Expression<Func<T, bool>> condition, Func<IQueryable<T>)
{
           IQueryable<T> query = _entities.Where(condition);
           return query;
}

Я пытаюсь сделать следующее:

Expression<Func<T1, bool>> expr2 = z => z.GetType().GetProperty("StringNumber").ToString() == "IB56";
BaseRepository<T1> iBase = new BaseRepository<T>(_databaseContext);
var tester1 = iBase. GetById(expr2, null).ToList();

Я пытаюсь динамически создать функцию выражения на основе универсального объекта T, чтобы затем вернуть результаты.

Я все равно не получаю. Если я изменю

`Expression<Func<T1, bool>> expr2' 

до

Expression<Func<actualObject, bool>> expr2 

Я тогда получаю следующую ошибку

Ошибка CS1503 Аргумент 1: невозможно преобразовать из 'System.Linq.Expressions.Expression>' в 'System.Linq.Expressions.Expression>'

Кто-нибудь может сказать мне, возможно ли то, что я пытаюсь сделать? Любые указатели, чтобы указать мне в правильном направлении, были бы благодарны / Помощь?

Пример кода ниже;

_uowAdmin.AdminRepository.ApproveProcess<MeetingOne, MeetingRoomOne, MeetingRoomTwo>(new MeetingRoomOne(), new MeetingRoomTwo());
_uowAdmin.AdminRepository.ApproveProcess<DiningOne, DiningRoomOne, DiningRoomTwo>(new DiningRoomOne(), new DiningRoomTwo());


public void ApproveProcess<T, T1, T2>(T1 classObject, T2 classSecondObject) where T : class
{

    BaseRepository<T> iBase = new BaseRepository<T>(_databaseContext);
    Expression<Func<T, bool>> expr2 = z => z.GetType().GetProperty("StringNumber").ToString() == "IB56";
    var tester1 = iBase.GetById(expr2, null).ToList();
}

public class BaseRepository<T> where T : class
{

    public IQueryable<T> GetById(Expression<Func<T, bool>> condition, Func<IQueryable<T>)
    {
           IQueryable<T> query = _entities.Where(condition);
           return query;
    }
}

1 Ответ

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

Попробуйте это:

var parameter = Expression.Parameter(typeof(T), "z");
var expr2 = Expression.Lambda<Func<T, bool>>(
    Expression.Equal(
        Expression.Property(parameter, "StringNumber"),
        Expression.Constant("IB56")),
    parameter);
...