0

У меня есть класс модели представления для получения списка Клиентов с их списком предложений.Как получить список ViewModel из базы данных?

Ресторан 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 при получении каждого предложения клиента, а производительность снижается.

Как повысить эффективность кода для повышения производительности?

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

Таким образом, вы можете просто цикл свойство предлагает от вашей модели Client

+0

Я. Ваш код также работает. Но он генерирует слишком много запросов SQL в базу данных для извлечения этих данных. Есть ли другой способ добиться того же? –

Смежные вопросы