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

时间:2019-08-22 00:27:53

标签: 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; }
} 

我正在尝试实现一种通用方法,该方法只能用于返回“活动”记录(即,非活动==假)。它将被称为:

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

}

1 个答案:

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

那不是容易吗?