У меня есть метод, который выглядит так:
private static IEnumerable<OrganizationViewModel> GetOrganizations()
{
var db = new GroveDbContext();
var results = db.Organizations.Select(org => new OrganizationViewModel
{
Id = org.OrgID,
Name = org.OrgName,
SiteCount = org.Sites.Count(),
DbSecureFileCount = 0,
DbFileCount = 0
});
return results;
}
Это возвращает результаты довольно быстро.
Однако вы заметите, что у OrganizationViewModel есть свойства, для которых установлено значение «0». В модели Organization есть свойства, которые я добавил через разделяемый класс и украсил [NotMapped]: UnsecureFileCount и SecureFileCount.
Если я изменю эти 0 на что-то полезное...
DbSecureFileCount = org.SecureFileCount,
DbFileCount = org.UnsecureFileCount
... Я получаю исключение «Поддерживаются только инициализаторы, члены сущностей и свойства навигации сущностей». Я нахожу это немного запутанным, потому что я не чувствую, что спрашиваю о них базу данных, я только устанавливаю свойства модели представления.
Однако, поскольку EF не прислушивается к моим аргументам, я попробовал другой подход:
private static IEnumerable<OrganizationViewModel> GetOrganizations()
{
var db = new GroveDbContext();
var results = new List<OrganizationViewModel>();
foreach (var org in db.Organizations)
{
results.Add(new OrganizationViewModel
{
Id = org.OrgID,
Name = org.OrgName,
DbSecureFileCount = org.SecureFileCount,
DbFileCount = org.UnsecureFileCount,
SiteCount = org.Sites.Count()
});
}
return results;
}
Технически это дает мне правильные результаты без исключения, но это занимает вечность. (Под «навсегда» я подразумеваю более 60 секунд, тогда как первая версия дает результаты менее чем за секунду.)
Есть ли способ оптимизировать второй подход? Или есть способ заставить работать первый подход?