2015-07-29 2 views
1

В основном у меня есть сайт MVC, в котором хранятся контакты с различной информацией, такой как имя, компания и т. Д., И эти посещения контактов в разных местах также регистрируются в отдельной базе данных, когда они проверить где-нибудь.Производительность кода - данные из двух разных баз данных, заполняющих просмотр

Таким образом, контакты и посещения проводятся в отдельных базах данных.

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

Я построил это, и он работает абсолютно нормально. Однако для большого количества контактов страница занимает много времени, чтобы заполнить ее. Итак, вот что такое мой процесс.

Во-первых, я получаю все текущие пользователи Контакты и создать список просмотра моделей из данных:

var model = DbContext.Contacts.Where(x => x.Organisation.Id == org.Id).ToList().Select(x => new AttendeeViewModel 
     { 
      Id = x.Id, 
      LastName = x.LastName, 
      FirstName = x.FirstName, 
      Company = x.Company, 
      Position = x.Position, 
      DateJoined = x.DateJoined == Convert.ToDateTime("1900-01-01 00:00:00.000") ? DateTime.Now : x.DateJoined, 
      lastVisit = findLastVisit(x)     
     }).ToList(); 

Как вы можете видеть на lastVisit я называю метод под названием findLastVisit():

public Visit findLastVisit(Contact contact) 
    { 

     var date = DateTime.Now; 

     var item = inboundContext.Visits. 
        Where(d => LocIds.Contains(d.LocationId) && 
        d.ContactId == contact.Id && 
        d.DateOfContact <= date) 
        .OrderByDescending(d => d.DateOfContact) 
        .FirstOrDefault(); 

     if (item != null) 
     { 
      return item; 
     } 
     else { return new Visit { }; } 

    } 

И затем в представлении я отображаю эту информацию для каждого профиля, в основном в списке. Так как страница загружена, весь этот список должен сначала заполнить страницу.

Таким образом, базовая функциональность потока я требую:

  • Fetch всех пользователь контактам из context1
  • Создания моделей просмотра с использованием последнего записанного посещения этого контакта с context2

Я испытал и проблема заключается в том, что метод findLastVisit() вызывается один раз для каждого контакта в списке. Это процесс получения последнего посещения для каждого контакта, который слишком долго заканчивается, когда числа становятся слишком большими. Это довольно неэффективно .... если я игнорирую данные lastVisit, тогда он загружается очень быстро.

Просто интересно, может ли кто-нибудь увидеть более эффективный способ сделать это, или если мне нужно вместо этого взглянуть на другие параметры, такие как рендеринг вида без последней информации о посещении, и пользователь, раскрывающий эту информацию, нажав на свой профиль.

JK

ответ

0

Вероятно, большинство решений это будет включать в себя разделив эти запросы на части и крафта, где часть так, что вы запрашиваете каждую базу данных один раз и оба ClientId колонны. Затем вы можете присоединиться к столбцам ContactId, имеющим конечный результат.

Это может быть сделано на различных уровнях, но один простой изменения вы могли бы попробовать было бы очень похоже, что вы имеете в 2-запроса - LocIds.Contains (..):

1) выбрать из DbContext.Контакты в временный список без findLastVisit() вызов,

2) выбрать соответствующую ClientId-е и передавать их на 2-й запрос

3) выбрать все последние путешествия даты для клиентов в списке идентификаторов и включают ClientId столбец в Результаты

4) присоедините 1-й запрос и 2-й запрос к столбцу ClientId в вашей модели.

Примечание: Вы не указали, что вы подразумеваете под «большим количеством контактов на странице», но я предположил, что это «страница» в веб-смысле, примерно 10-100 строк.

+0

Да, мой тест рассчитан примерно на 1000 контактов. Просто хочу посмотреть, как быстро я могу получить его, прежде чем принимать решение об упрощении вида. Спасибо за ответ. Я также думаю, что я должен изменить свой второй запрос, чтобы включать только последние посещения, используя Distinct и группировку по ContactId ... Я дам это сейчас – JonnyKnottsvill

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