Рад держать это открытым некоторое время и видеть другие ответы, но я придерживаюсь того, что у меня есть сейчас.
Один момент, который я хотел бы упомянуть относительно моей РЕДАКТИРОВАТЬ выше.
Проекция загруженного запроса на анонимный тип, по-видимому, теряет включенную связь.Я понятия не имею, почему.
Обходной путь, который я использовал, заключался в том, чтобы включить загруженную нетерпением ассоциацию в анонимный тип:
var cities = locationRepository
.Find()
.OfType<City>()
.Select(x => new
{
Location = x,
State = x.State, // include association in anon type
TopPost = x.Posts.OrderByDescending(r => x.Rating).FirstOrDefault()
}).Take(20).ToList();
foreach (var city in cities)
{
var aggregatedCity = city.Location;
aggregatedCity.State = city.State; // copy anon type association over
aggregatedCity.Posts = new List<Post> { aggregatedCity.TopPost };
results.Add(city);
}
И это, похоже, работает.
С точки зрения рефакторинга кода, я не думаю, что запрос var cities
можно оптимизировать.Я попытался переместить foreach
копирование слева направо в другую проекцию .Select
(например, после того, как запрос был материализован - после .ToList()
), но для этого мне пришлось бы слева направоПравильно скопируйте ВСЕ свойства, например:
var cities = locationRepository
.Find()
.OfType<City>()
.Select(x => new
{
Location = x,
State = x.State, // include association in anon type
TopPost = x.Posts.OrderByDescending(r => x.Rating).FirstOrDefault()
}).Take(20).ToList().Select(x => new City
{
CityName = Location.Name,
State = State,
// etc etc
});
Учитывая, что у меня более 20 свойств на моих объектах, я не хочу этого делать.Возвращает меня в болезненный мир Linq-To-Sql и POCO.
Как я уже сказал - открыт для других предложений.
РЕДАКТИРОВАТЬ
Я закончил с использованием хранимой процедуры здесь.Мой код работает, но это более 100 строк.Я бы предпочел, чтобы эти 100+ строк абстрагировались в хранимую процедуру.
Кроме того, этот результат в основном только для чтения (мне не нужны сущности на графике - я просто получаю результаты, отображаюих и покончим с этим).