使用泛型和接口转换问题的 Linq 查询

我有以下界面:


public interface IInactive

{

    bool inactive { get; set; }

}

以及实现该接口的几个对象(实体框架实体),例如:


public class Order : IInactive

{

    [Key]

    [Required]

    public Guid orderId { get; set; }

    ...

    public bool inactive { get; set; }

我正在尝试实现一个通用方法,该方法可用于仅返回“活动”记录(即非活动== false)。它将被称为如下:


var query = GetAllActive<Order>();

我的这个通用方法的代码如下所示:


public IQueryable<T> GetAllActive<T>() where T : class

{

    DbSet<T> dbSet = this._db.Set<T>();


    IQueryable<IInactive> query2 = dbSet as IQueryable<IInactive>;

    query2 = query2.Where(w => !w.inactive);

    return (DbSet <T>)query2;


    // System.InvalidCastException: 'Unable to cast object of type 'System.Data.Entity.Infrastructure.DbQuery`1[Portal.Domain.Entities.Interfaces.IInactive]' to type 'System.Data.Entity.DbSet`1[Portal.Domain.Entities.Order]'.'


}


小唯快跑啊
浏览 93回答 1
1回答

有只小跳蛙

由于您的代码仅适用于继承自 的记录IActive,因此对其进行约束。当您这样做时,属于该接口的属性和方法在 的实例中变得可用T。public IQueryable<T> GetAllActive<T>() where T : IActive&nbsp; //Here is the magic{&nbsp; &nbsp; return this._db.Set<T>()&nbsp; &nbsp; &nbsp; &nbsp; .Where( w => !w.inactive );}那不是更容易吗?
打开App,查看更多内容
随时随地看视频慕课网APP