如何使用LINQ用数据库中的数据填充List?

ntjbwcob  于 2023-03-15  发布在  其他
关注(0)|答案(2)|浏览(127)

我需要从数据库中添加数据到List<Clients>。我从数据库中提取数据,现在我不知道如何正确地做,什么是这种操作的好模式/标准。下面你可以找到我的代码。我需要填充List<Clients>。我不认为我在这里遵循了良好的实践,我想我可以做得更简单,但不知 prop 体怎么做。我不认为我在这里返回了一个带有数据的列表,我认为我没有正确地填充它。

public class Clients
    {
        public Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
    }

    public interface IClientsRepository
    {
        Task<List<Clients>> ListAllClients();
    }

    public class ClientsRepository : IClientsRepository
    {
        private List<Clients> _clientsList;

        public ClientsRepository(MainDbContext dbContext) : base(dbContext)
        {
        }

        public async Task<List<Clients>> ListAllClients()
        {
            _clientsList = new List<Clients>();

            var query = await _dbContext.ClientsTbl
                                .AsNoTracking()
                                .Join(_dbContext.AddressTbl.AsNoTracking(),
                                client => client.Id,
                                address => address.ClientId,
                                (client, address) => new
                                {
                                    client.Id,
                                    client.Name,
                                    address.FullAddress
                                })
                                .ToListAsync();

            var allClients = query
                            .Select(s => new Clients 
                            { 
                                Id = s.Id,
                                Name= s.Name,
                                Address = s.FullAddress
                            });
            
            return _clientsList;
        }
    }
}
f4t66c6m

f4t66c6m1#

由于Address实体具有属性address.ClientId,并且客户端模型包含属性Address
地址模型和客户端模型具有一对一的关系

public partial class Client
    {
        public int Id { get; set; }
        public string? Name { get; set; }
        public Address Address { get; set; }
    }

    public  partial class Address
    {
        public int Id { get; set; }
        public string? FullAddress { get; set; }
        public int ClientId { get; set; }

        public Client Client { get; set; }
    }

您可以选中此document并选择一个解决方案来读取相关数据
例如:

var clients = await _context.Client.Include(x=>x.Address).ToListAsync();

现在你可以通过navigation属性读取read fulladdress:

clients[0].Address.FullAddress

您是否尝试过以下方法:
我在客户端实体中添加了一个属性

public string? FullAddress { get; set; }

var clients = await _context.Client.AsNoTracking().Join(_context.Address.AsNoTracking(), x => x.Id, y => y.ClientId, (client, address) => new Client{ Id=client.Id, Name=client.Name, FullAddress=address.FullAddress }).ToListAsync();

结果:

nkoocmlb

nkoocmlb2#

如果您的MainDbContext中有DbSet<Clients> ClientsTbl,那么您可以像这样简单地返回它。

return await _dbContext.ClientsTbl.ToListAsync();

我不确定您使用string AddressAddressTbl上加入是否正确。
如果您希望将ClientsAddresses一起返回,则最好在它们之间创建一个Relationship
喜欢

public class Clients
{
   public Id { get; set; }
   public string Name { get; set; }   
   public Address Address { get; set; }
    
}

public  partial class Address
{
    public int Id { get; set; }
    public string? FullAddress { get; set; }
    public int ClientId { get; set; }

    [ForeignKey("ClientId")]
    public Client Client { get; set; }
}

然后,您将需要一个迁移来将新的关系应用到数据库。这也适用于数据库优先的方法。
然后你可以像@RuikaiFeng建议的那样,把你的客户和地址一起返回。

return await _dbContext.ClientsTbl.Include(x=>x.Address).ToListAsync();

请检查EF Core Docs关于这一点。

相关问题