我有以下界面:
public interface IInactive
{
bool inactive { get; set; }
}
以及实现该接口的多个对象(实体框架实体),例如:
public class Order : IInactive
{
[Key]
[Required]
public Guid orderId { get; set; }
...
public bool inactive { get; set; }
}
我正在尝试实现一种通用方法,该方法只能用于返回“活动”记录(即,非活动==假)。它将被称为:
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]'.'
}
答案 0 :(得分:2)
由于您的代码仅适用于从IActive
继承的记录,因此应将其约束。这样做时,属于该接口的属性和方法在T
的实例中可用。
public IQueryable<T> GetAllActive<T>() where T : IActive //Here is the magic
{
return this._db.Set<T>()
.Where( w => !w.inactive );
}
那不是容易吗?