繁体   English   中英

实体框架中的通用查询方法

[英]Generic query method in Entity Framework

在我的数据库中,我有一些表,它们的属性为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);
  }
}

IDeletableIDeletable地方:

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();

我怎么解决这个问题? 您能想到一种修复或其他方法来获得相似的结果吗? 谢谢

您遇到的问题是,实体框架只能与表达式树一起使用。 您的函数直接执行查询,而不是构建表达式树。

一个更简单的解决方案是添加模型定义函数

可以在上下文的实例上直接调用模型定义的函数。

在实际查询之前,您是否尝试过将对象转换为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>();
}

我尚未测试此代码,但是,错误提示,我记得我必须做类似的事情。

也许:

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));
}

Tsss,这就是答案: Linq Entity Framework通用过滤方法

我在这里忘了class

...其中T: class ,IDeletable

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM