C# 使用泛型的Linq查询&;接口铸造问题

C# 使用泛型的Linq查询&;接口铸造问题,c#,entity-framework,linq,generics,interface,C#,Entity Framework,Linq,Generics,Interface,我有以下界面: public interface IInactive { bool inactive { get; set; } } 以及几个实现该接口的对象(实体框架实体),例如: public class Order : IInactive { [Key] [Required] public Guid orderId { get; set; } ... public bool inactive { get; set; } } 我正在尝试实

我有以下界面:

public interface IInactive
{
    bool inactive { get; set; }
}
以及几个实现该接口的对象(实体框架实体),例如:

public class Order : IInactive
{
    [Key]
    [Required]
    public Guid orderId { get; set; }
    ...
    public bool inactive { get; set; }
} 
我正在尝试实现一个通用方法,该方法可用于仅返回“活动”记录(即inactive==false)。其名称如下:

var query = GetAllActive<Order>();
var query=GetAllActive();
此泛型方法的代码如下所示:

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]'.'

}
public IQueryable getAllActivity(),其中T:class
{
DbSet DbSet=this._db.Set();
IQueryable query2=dbSet为IQueryable;
query2=query2.Where(w=>!w.inactive);
返回(DbSet)查询2;
//System.InvalidCastException:'无法将'System.Data.Entity.Infrastructure.DbQuery'1[Portal.Domain.Entities.Interfaces.IInactive]'类型的对象强制转换为'System.Data.Entity.DbSet'1[Portal.Domain.Entities.Order]'
}

由于您的代码仅适用于从
IActive
继承的记录,因此请将其约束为这样。当您这样做时,属于接口的属性和方法将在
T
的实例中可用

public IQueryable<T> GetAllActive<T>() where T : IActive  //Here is the magic
{
    return this._db.Set<T>()
        .Where( w => !w.inactive );
}
public IQueryable getAllActivity(),其中T:IActive//这就是神奇之处
{
返回此值。_db.Set()
。其中(w=>!w.inactive);
}

这不是很容易吗?

因为您的代码只处理从
IActive
继承的记录,所以请将其约束为这样。当您这样做时,属于接口的属性和方法将在
T
的实例中可用

public IQueryable<T> GetAllActive<T>() where T : IActive  //Here is the magic
{
    return this._db.Set<T>()
        .Where( w => !w.inactive );
}
public IQueryable getAllActivity(),其中T:IActive//这就是神奇之处
{
返回此值。_db.Set()
。其中(w=>!w.inactive);
}

这不是很容易吗?

您真的需要将此方法设置为泛型方法吗?因为您的代码将始终查询IInactive,因此为什么不将您的方法签名转换为
public IQueryable GetAllActivity()
您真的需要将此方法设置为泛型方法吗?因为您的代码总是查询iInActivity,因此为什么不将您的方法签名转换为
public IQueryable GetAllActivity()
对不起,John,为了简化问题,我遗漏了一些代码。我无法执行:public IQueryable GetAllActivity(),其中T:iInActivity,因为我希望该方法能够接受非iInActivity对象。@BillHaack如何筛选没有
inactive
属性的类?@juharr if(typeof(iInActivity).IsAssignableFrom(typeof(T)))@比尔哈克你知道这正是我最初的建议,对吧?我接受了这个解决方案。尽管这并不是我想要的,但它可能是解决这个问题的最佳方案@madreflection,抱歉,当您在上一个问题中提出您的解决方案时,您应该接受它!!对不起,John,为了简化问题,我遗漏了一些代码。我无法执行:public IQueryable GetAllActivity(),其中T:iInActivity,因为我希望该方法能够接受非iInActivity对象。@BillHaack如何筛选没有
inactive
属性的类?@juharr if(typeof(iInActivity).IsAssignableFrom(typeof(T)))@比尔哈克你知道这正是我最初的建议,对吧?我接受了这个解决方案。尽管这并不是我想要的,但它可能是解决这个问题的最佳方案@madreflection,抱歉,当您在上一个问题中提出您的解决方案时,您应该接受它!!