表达式> 在泛型方法中创建时会添加一个不需要的转换

本文关键字:添加 一个 转换 不需要 创建 Func bool 表达式 泛型方法 | 更新日期: 2023-09-27 17:57:19

我有一个函数来生成要在linq Where子句中使用的表达式。

public static Expression<Func<T,bool>> GetWhereCondition<T>() where T : IActive
{
    return x => x.Active;
}

(注意 IActive 仅定义属性"活动")

还有其他相关的函数,这个想法是我可以将所需的条件注入到 Generic 类中以控制业务规则等。

问题是当我运行这个时,返回的表达式包含 lamda(从调试器中看到):

x => Convert(x).Active

这当然被 linq 拒绝了:"LINQ to Entities 仅支持强制转换实体数据模型基元类型。"

所以我的问题是...

如何防止这种行为。没有必要转换,显然这是不可取的。甚至有可能防止这种情况吗?

表达式<Func<T,bool>> 在泛型方法中创建时会添加一个不需要的转换

好吧,假设这只需要处理类(转换是针对装箱值类型),您可以添加一个class约束:

public static Expression<Func<T, bool>> GetWhereCondition<T>() where T : class, IActive
{
    return x => x.Active;
}

。转换消失了。

试试这个:

public static Expression<Func<T, bool>> GetWhereCondition<T>() where T : IActive
{
    return x => x.Active;
}