为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
小唯快跑啊 2023-09-16 16:57:53
我有以下界面: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]'.'}
查看完整描述

1 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

由于您的代码仅适用于继承自 的记录IActive,因此对其进行约束。当您这样做时,属于该接口的属性和方法在 的实例中变得可用T。


public IQueryable<T> GetAllActive<T>() where T : IActive  //Here is the magic

{

    return this._db.Set<T>()

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

}

那不是更容易吗?


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信