【问题标题】:Select list of objects from navigation property in Entity Framework Core从 Entity Framework Core 的导航属性中选择对象列表
【发布时间】:2021-10-20 13:33:05
【问题描述】:

我有以下具有导航属性的实体。

public class Member
    {
        public Member()
        {
            Id = 0;
            IsActive = true;
            BillDetails = new List<BillDetail>();            
        }

        public int Id { get; set; }        
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public bool IsActive { get; set; }
        public int? OrgId { get; set; }    
        public IList<BillDetail> BillDetails { get; set; }
    }
    

我有一个通用存储库:

public abstract class BaseRepository<TEntity, TId> : IRepository<TEntity, TId> where TEntity : class
    {
        private readonly IApplicationDbContext _db;

        public BaseRepository(IApplicationDbContext db)
        {
            _db = db;
        }

        public virtual void Add(TEntity entity)
        {
            _db.Set<TEntity>().Add(entity);
            _db.Entry(entity).State = EntityState.Added;
        }

        public virtual bool Update(TEntity entity)
        {
            _db.Set<TEntity>().Attach(entity);
            _db.Entry(entity).State = EntityState.Modified;
            return true;
        }

        public virtual bool Delete(TEntity entity)
        {
            _db.Set<TEntity>().Remove(entity);
            _db.Entry(entity).State = EntityState.Deleted;
            return true;
        }

        public virtual IQueryable<TEntity> Query()
        {
            return _db.Set<TEntity>().AsQueryable();
        }

        public virtual EntityEntry<TEntity> Entry(TEntity entity)
        {
            return _db.Entry(entity);
        }

        public void Attach(TEntity entity)
        {
            if (entity == null || _db.Entry(entity).State != EntityState.Detached)
                return;

            _db.Set<TEntity>().Attach(entity);
        }

        public void Detach(TEntity entity)
        {
            if (entity == null)
                return;

            _db.Entry(entity).State = EntityState.Detached;
        }

        public abstract Task<TEntity> FindAsync(TId id);
    }

我想从我的服务类中获取以下类型的对象集合

public class MemberBill
{
    public int MemberId {get; set;}
    public decimal BillAmount {get; set;}
}

在我的服务类中,我有以下查询。现在如何从以下查询中获取对象列表 (MemberBill)?

var query = (_memberRepository.Query().Where(x => x.IsActive == true && x.OrgId == orgId)
                .Include(x => x.BillDetails.Where(y => y.IsActive == true))).AsNoTracking().AsQueryable();

            List<IList<BillDetail>> memberBills = query.Select(x => x.BillDetails).ToList();

            memberBills.Select(x => new MemberBill
            {
                MemberId = x.
            }).ToList();

请帮我找出解决办法。

【问题讨论】:

  • 你能把你的 billdetail 课贴出来吗?

标签: c# entity-framework linq .net-core entity-framework-core


【解决方案1】:

试试这个

var query = _memberRepository.Query()
.Where(x => x.IsActive == true && x.OrgId == orgId)
.Include(x => x.BillDetails.Where(y => y.IsActive == true))
.AsNoTracking()
.ToList();

var memberBills=new List<MemberBill>();

foreach(var m in query)
{
memberBills.Add( new MemberBill 
                  {
                   MemberId= m.Id, 
                   BillAmount=m.BillDetails.Sum(i=> i.Amount)
                  });
}

【讨论】:

    【解决方案2】:

    离开这里的高性能解决方案。当前接受的答案使用大量内存和服务器资源。

    var query = 
        from m in _memberRepository.Query()
        where m => m.IsActive == true && m.OrgId == orgId
        from bd in m.BillDetails.Where(bd => bd.IsActive == true)
        group bd by new { m.Id } into g
        select new MemberBill
        {
            MemberId = g.Key.Id,
            BillAmount = g.Sum(x => x.Amount
        };
    
    var memberBills = query.ToList();
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2016-06-05
    • 2017-01-01
    • 2021-05-17
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多