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