.Net Core with Repository设计模式-是否从另一个表中获取相关数据?[已关闭]

ca1c2owp  于 2022-11-26  发布在  .NET
关注(0)|答案(1)|浏览(108)

已关闭。此问题需要更多focused。当前不接受答案。
**想要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。

2天前关闭。
Improve this question

  • 我的项目是关于库存管理的。公司的人员在一段时间内有借记项目(每个项目的时间可以改变)。*

我不能做的是在我的库存MediaTr处理程序上,我试图获得与ID数据对应的人的firstnamelastname。并在第一列使用它。但得到错误。我想我需要学习很多,但我找不到任何像我这样的库结构的例子。我有500个错误在personname变量上,不能'I don’我不能完成我想要的。

在我的后端,我使用了Onion架构(在IOC的帮助下)+ CQRS模式(mediaTr)+仓库设计模式

信息库. cs:

namespace EnvanterAPI.Application.Repositories
{
    public interface IRepository<T> where T : BaseEntity
    {
        DbSet<T> Table { get; }
    }
}

I读取储存库. cs:

namespace EnvanterAPI.Application.Repositories
{
    public interface IReadRepository<T> : IRepository<T> where T : BaseEntity
    {
        IQueryable<T> GetAll(bool tracking = true);
        IQueryable<T> GetWhere(Expression<Func<T, bool>> method, bool tracking = true);
        Task<T> GetSingleAsync(Expression<Func<T, bool>> method, bool tracking = true);
        Task<T> GetByIdAsync(string id, bool tracking = true);
    }
}

下面是持久性中的Repository.cs:

namespace EnvanterAPI.Persistence.Repositories
{
    public class ReadRepository<T> : IReadRepository<T> where T : BaseEntity
    {
        private readonly EnvanterAPIDbContext _context;
        public ReadRepository(EnvanterAPIDbContext context)
        {
            _context = context;
        }

        public DbSet<T> Table => _context.Set<T>();

        public IQueryable<T> GetAll(bool tracking = true)
        {
            var query = Table.AsQueryable();
            if (!tracking)
                query = query.AsNoTracking();
            return query;
        }
        public IQueryable<T> GetWhere(Expression<Func<T, bool>> method, bool tracking = true)
        {
            var query = Table.Where(method);
            if (!tracking)
                query = query.AsNoTracking();
            return query;
        }
        public async Task<T> GetSingleAsync(Expression<Func<T, bool>> method, bool tracking = true)
        {
            var query = Table.AsQueryable();
            if (!tracking)
                query = Table.AsNoTracking();
            return await query.FirstOrDefaultAsync(method);
        }
        public async Task<T> GetByIdAsync(string id, bool tracking = true)
        {
            var query = Table.AsQueryable();
            if (!tracking)
                query = Table.AsNoTracking();
            return await query.FirstOrDefaultAsync(data => data.Id == Guid.Parse(id));
        }
    }
}

这里有实体;

基本实体. cs:

namespace EnvanterAPI.Domain.Entities.Common
{
    public class BaseEntity
    {
        public Guid Id { get; set; }
        public DateTime CreatedDate { get; set; }
        virtual public DateTime UpdatedDate { get; set; }
    }
}

库存. cs:

namespace EnvanterAPI.Domain.Entities
{
    public class Inventory : BaseEntity
    {
        public string Type { get; set; }
        public string Brand { get; set; }
        public string Model { get; set; }
        public string SeriNo { get; set; }
        public string DebitNo { get; set; }
        public string? Description { get; set; }
        public string? Source { get; set; }
        public string Status { get; set; }
        public DateTime DebitStart { get; set; }
        public DateTime? DebitEnd { get; set; }
        public Guid PersonalId { get; set; }
        public ICollection<Category> Categories { get; set; }
    }
}

个人. cs:

namespace EnvanterAPI.Domain.Entities
{
    public class Personal : BaseEntity
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime JoinDate{ get; set; }
        public DateTime? QuitDate { get; set; }
        public string IdentityNo { get; set; }
        public string? RegisterNo { get; set; }
        public DateTime DateOfBirth { get; set; }
        public string Email { get; set; }
        public string? Unit { get; set; }
        public string Title { get; set; }
        public string MobilePhone { get; set; }
        public string? WorkPhone { get; set; }
        public string Firm { get; set; }
        public AppUser User { get; set; }
        public ICollection<Inventory> Inventories { get; set; }
        public ICollection<WareData> WareDatas { get; set; }

    }
}

我有导航属性(如相关数据的急切加载- EF核心|所以我没有在导航属性上使用“虚拟”关键字。
MediaTR处理程序:

namespace EnvanterAPI.Application.Features.Queries.Inventory.GetAllInventory
{
    public class GetAllInventoryQueryHandler : IRequestHandler<GetAllInventoryQueryRequest, GetAllInventoryQueryResponse>
    {
        readonly IInventoryReadRepository _inventoryReadRepository;
        readonly IPersonalReadRepository _personalReadRepository;
        public GetAllInventoryQueryHandler(IInventoryReadRepository inventoryReadRepository, IPersonalReadRepository personalReadRepository)
        {
            _inventoryReadRepository = inventoryReadRepository;
            _personalReadRepository= personalReadRepository;
        }

        public async Task<GetAllInventoryQueryResponse> Handle(GetAllInventoryQueryRequest request, CancellationToken cancellationToken)
        {
            var totalInventoryCount = _inventoryReadRepository.GetAll(false).Count();

            var inventories = _inventoryReadRepository.GetAll(false).Skip(request.Page * request.Size).Take(request.Size)
                .Select(p => new
                {
                    p.Id,
                    p.Type,
                    p.Brand,
                    p.Model,
                    p.SeriNo,
                    p.DebitNo,
                    p.Description,
                    p.Source,
                    p.Status,
                    p.DebitStart,
                    p.DebitEnd,
                    p.PersonalId,
                    p.CreatedDate,
                    p.UpdatedDate,
                }).ToList();

            var personname = _personalReadRepository.GetAll(false).Where(r => r.Id == p.PersonalId)
                .Include(r => r.FirstName)
                .Include(r => r.LastName)
                .ToListAsync();
            return new()
            {
                Inventories = inventories,
                TotalInventoryCount = totalInventoryCount,
               Personname = personname,
            };
        }
    }
}

MediaTr回应:

namespace EnvanterAPI.Application.Features.Queries.Inventory.GetAllInventory
{
    public class GetAllInventoryQueryResponse
    {
        public int TotalInventoryCount { get; set; }
        public object Inventories { get; set; }
        public object Personname { get; set; }
    }
}

如有任何帮助或指导,敬请谅解。

h43kikqp

h43kikqp1#

事先做好几件事:
1.在字符串上使用==可能会导致意想不到的问题,如果有人在数据库中的某个地方抛出了一个大写字母错误的手动条目(r.Id == p.PersonalId)。
1.我不知道GetAll()背后的逻辑是什么,但是如果您使用的是(noSQL)数据库,GET是基于ID完成的(性能更好,因为数据库确切地知道要获取什么)。Query将执行数据库的自定义搜索。看起来您的函数更像是Query而不是Get
1.请与链接函数的缩进保持一致。您不会缩进.Where.GetAll,但突然开始缩进.Include()
也就是说,有两个问题。
1.您使用了Include(),但可能并不需要它。
1.在您的Where中,您指涉了范围中不存在的p.PersonalId
以下方法应该有效:

_personalReadRepository
                .GetAll(false)
                .Where(r => inventories
                     .Select(a => a.PersonalId)
                     .Contains(r.Id))
                .ToListAsync();

相关问题