0

我有一個視圖模型類用於獲取客戶列表及其提供的列表。如何從數據庫中獲取ViewModel的列表?

餐廳視圖模型

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; } 

在我的大tabase,我有一個ClientOffer表也映射客戶與他們的報價,如:

***"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 server中執行查詢,同時檢索每個客戶端的報價,並且性能下降。

我應該如何提高代碼效率以獲得更好的性能?

+0

大約需要10秒才能檢索所有餐廳及其優惠。 –

回答

1

你需要一個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查詢,它將返回創建視圖模型所需的所有數據。

+0

謝謝。這幫助我很多。 –

1

爲什麼不爲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; } 
    } 

因此增加報價的集合,你可以循環屬性從你的模型客戶提供

+0

Ya。你的代碼也在工作。但是它會向數據庫生成太多的SQL查詢來檢索這些數據。有沒有其他辦法可以達到同樣的效果? –

相關問題