【问题标题】:Create dynamic Expression<Func<T, bool>>创建动态表达式<Func<T, bool>>
【发布时间】:2019-04-02 15:50:54
【问题描述】:

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

我有一个方法叫:ApproveProcess&lt;T1, T2&gt;(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;
    }
}

【问题讨论】:

  • 能否修复代码示例中的编译错误?
  • 我已经尝试了几种方法让它工作。我只是不确定我正在尝试做什么。我无法将动态表达式 func 传递给泛型表达式 func 以返回结果
  • 我可以创建 20 多个类似的方法来返回结果但想要创建更通用的方法
  • 你能举一个例子(带有可编译代码)这 20 多种方法之一吗?
  • TApproveProcess的声明中在哪里?

标签: c# asp.net-core func c#-7.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);

【讨论】:

  • Paulo Morgado 效果很好,可以返回我需要的东西。哪个好。但是,我需要重新考虑设计类型以实现我的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
相关资源
最近更新 更多