实体框架中的通用查询方法
本文关键字:查询 方法 框架 实体 | 更新日期: 2023-09-27 18:18:07
在我的DB中,我有一个属性int DeleteState
的表。我想要一个通用的方法来查询这些表。换句话说,一个方法可以这样做:Context.Table.Where(x => x.DeleteState == 0)
。
我想我可以这样做:
public static class Extensions
{
public static IQueryable<T> Exists<T>(this IQueryable<T> qry) where T : IDeletable
{
return qry.Where(x => x.DeleteState == 0);
}
}
其中IDeletable
为:
public interface IDeletable
{
int DeleteState { get; set; }
}
现在我只需要在EF模型中添加IDeletable
:
public partial class Table : EntityObject, IDeletable { ... }
我是用模板机制做的。
不幸的是,它不起作用:(它编译得很好,但在运行时抛出:
Unable to cast the type 'Table' to type 'IDeletable'. LINQ to Entities only supports casting Entity Data Model primitive types
如果我这样称呼它:
Context.Table.Exists();
我该如何解决这个问题?你能想到一个修复或不同的方法来达到类似的结果吗?Thx
问题是实体框架只能与表达式树一起工作。您的函数直接执行查询,而不是构建表达式树。
一个更简单的解决方案是添加一个模型定义函数。
Maybe:
public static IQueryable<T> Exists<T>(this IQueryable<T> qry)
{
return qry.Where(x => (!typeof(IDeletable).IsAssignableFrom(x.GetType()) || typeof(IDeletable).IsAssignableFrom(x.GetType()) && ((IDeletable)x).DeleteState == 0));
}
哎呀,这就是答案:Linq实体框架通用过滤器方法
我忘了这里的class
:
…where T: class, IDeletable
您是否尝试过在实际查询之前将对象转换为IDeletable
?例如
public static IQueryable<T> Exists<T>(this IQueryable<T> qry)
{
return qry.Select<T, IDeletable>(x => x).Where(x => x.DeleteState == 0).Cast<T>();
}
我没有测试过这段代码,但是,这个错误让我想起了,我记得我必须做一些类似的事情。