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

Max*_*Max 8 c# linq lambda entity-framework expression-trees

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

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

(注意IActive仅定义属性'Active')

还有其他相关的功能,我的想法是我可以将所需的条件注入Generic类来控制业务规则等.

问题是当我运行它时,返回的Expression包含lamda(从调试器中看到):

x => Convert(x).Active
Run Code Online (Sandbox Code Playgroud)

这当然被linq拒绝:'LINQ to Entities仅支持转换实体数据模型基元类型.

所以我的问题是......

如何防止此行为.没有必要进行转换,显然它是不可取的.是否有可能阻止这种情况?

Ani*_*Ani 10

好吧,假设这只需要使用类(转换是拳击值类型),你可以添加一个class约束:

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

......转换消失了.

  • 啊,有意思; 根本区别在于"约束"与"呼唤"之间的变化; 有趣的是,它让它工作 (2认同)