c# - Expression<Func<T,bool>> 在泛型方法中创建时添加不需要的 Convert

标签 c# linq entity-framework lambda expression-trees

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

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

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

还有其他相关的功能,我的想法是我可以将所需的条件注入(inject)到通用类中以控制业务规则等。

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

x => Convert(x).Active

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

所以我的问题是...

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

最佳答案

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

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

...然后转换就消失了。

关于c# - Expression<Func<T,bool>> 在泛型方法中创建时添加不需要的 Convert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14650234/

相关文章:

c# - 优化 LINQ 表达式

c# - 有没有办法将 "try parse"字符串发送到 System.Globalization.CultureInfo

c# - 如何使用automapper解析绝对url

c# - 围绕写入的锁定是否保证在另一个线程中进行新鲜读取? (.Net,内存模型)

entity-framework - 在 Entity Framework 中将模型属性设置为 bool 值

c# - 在 Entity Framework 中测试 View 模型

xcode - 如何让Xcode核心数据代码生成的文件可以公开访问

c# - 字符串日期比较 C#

c# - 如何将匿名类型强制转换为指定的强制转换以获取其所有属性

c# - 将 List<Product> 拆分为 SubLists<Product>