如何从数据库中获取 ViewModel 列表?
How to get list of ViewModel from database?
我有一个视图模型 class 用于获取客户列表及其报价列表。
餐厅景观模型
public class RestaurantsListVM
{
public Client client { get; set; }
public List<Offer> offers { get; set};
}
客户端模型
public class Client
{
public Guid Id { get; set; }
public String RestaurantName { get; set; }
}
报价型号
public class Offer
{
public Guid Id { get; set; }
public String OfferName { get; set; }
public decimal OfferPercentage { get; set; }
在我的数据库中,我有一个 ClientOffer Table,它也将客户与他们的报价映射在一起,例如:
***"ClientOfferId,ClientId,OfferId"***
所以我创建了这个函数来从数据库中检索数据。
public List<RestaurantsListVM> GetRestaurants()
{
List<RestaurantsListVM> restaurantlist = new List<RestaurantsListVM>();
var clients = new Client().GetClients();
foreach (Client c in clients)
{
RestaurantsListVM restaurantdetails = new RestaurantsListVM();
restaurantdetails.client = c;
restaurantdetails.offers = new Offer().GetOffers(c.Id);
restaurantlist.Add(restaurantdetails);
}
return restaurantlist;
}
它工作正常。但问题是它在 sql 服务器中一次又一次地执行查询,同时检索每个客户端报价,性能下降。
我应该如何提高代码效率以获得更好的性能?
为什么不为 ClientOffer 创建模型?
public class ClientOffer
{
public Guid client_id { get; set; }
[ForeignKey("client_id")]
public Client client { get; set; }
public Guid offer_id { get; set; }
[ForeignKey("offer_id")]
public Offer offer { get; set; }
}
并且在您的客户端模型中,您可以添加报价集合
public class Client
{
public Guid Id { get; set; }
public String RestaurantName { get; set; }
public ICollection<ClientOffer> offers { get; set; }
}
因此,您可以循环使用来自您的模型客户
的属性报价
您需要一个 LINQ 查询,它将在一个 SQL 查询中连接表。目前您获得所有客户,然后为每个客户获得他们的报价。类似于:
var clientOffers = (from cli in dbContext.Clients
join cli_ofr in dbContext.ClientOffer
on cli.ClientId
equals cli_ofr.ClientId
join ofr in dbContext.Offers
on cli_ofr.OfferId
equals ofr.OfferId
select new {
Client = new Client { Guid = cli.Guid...},
Offer = new Offer { Guid = ofr.Guid... }
}).toList();
这将生成一个 SQL 查询,它将 return 创建视图模型所需的所有数据。
我有一个视图模型 class 用于获取客户列表及其报价列表。
餐厅景观模型
public class RestaurantsListVM
{
public Client client { get; set; }
public List<Offer> offers { get; set};
}
客户端模型
public class Client
{
public Guid Id { get; set; }
public String RestaurantName { get; set; }
}
报价型号
public class Offer
{
public Guid Id { get; set; }
public String OfferName { get; set; }
public decimal OfferPercentage { get; set; }
在我的数据库中,我有一个 ClientOffer Table,它也将客户与他们的报价映射在一起,例如:
***"ClientOfferId,ClientId,OfferId"***
所以我创建了这个函数来从数据库中检索数据。
public List<RestaurantsListVM> GetRestaurants()
{
List<RestaurantsListVM> restaurantlist = new List<RestaurantsListVM>();
var clients = new Client().GetClients();
foreach (Client c in clients)
{
RestaurantsListVM restaurantdetails = new RestaurantsListVM();
restaurantdetails.client = c;
restaurantdetails.offers = new Offer().GetOffers(c.Id);
restaurantlist.Add(restaurantdetails);
}
return restaurantlist;
}
它工作正常。但问题是它在 sql 服务器中一次又一次地执行查询,同时检索每个客户端报价,性能下降。
我应该如何提高代码效率以获得更好的性能?
为什么不为 ClientOffer 创建模型?
public class ClientOffer
{
public Guid client_id { get; set; }
[ForeignKey("client_id")]
public Client client { get; set; }
public Guid offer_id { get; set; }
[ForeignKey("offer_id")]
public Offer offer { get; set; }
}
并且在您的客户端模型中,您可以添加报价集合
public class Client
{
public Guid Id { get; set; }
public String RestaurantName { get; set; }
public ICollection<ClientOffer> offers { get; set; }
}
因此,您可以循环使用来自您的模型客户
的属性报价您需要一个 LINQ 查询,它将在一个 SQL 查询中连接表。目前您获得所有客户,然后为每个客户获得他们的报价。类似于:
var clientOffers = (from cli in dbContext.Clients
join cli_ofr in dbContext.ClientOffer
on cli.ClientId
equals cli_ofr.ClientId
join ofr in dbContext.Offers
on cli_ofr.OfferId
equals ofr.OfferId
select new {
Client = new Client { Guid = cli.Guid...},
Offer = new Offer { Guid = ofr.Guid... }
}).toList();
这将生成一个 SQL 查询,它将 return 创建视图模型所需的所有数据。