创建动态Expression <func <t,bool =“” >>

时间:2018-10-29 16:45:00

标签: c# asp.net-core func c#-7.0

我不知道这是否可行,但我正在尝试通过执行以下操作来重构代码逻辑;

我有一个方法叫: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 :(得分:1)

尝试一下:

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