Entity Framework: Как уменьшить попадания в базу данных? - PullRequest
0 голосов
/ 26 сентября 2011

Таким образом, у меня есть этот запрос в моем хранилище (также с использованием шаблона Unit of Work), который использует энергичную загрузку, чтобы совершить одно попадание в базу данных:

from g in _context.Games.Include(pg => pg.PreviousGame).Include(go => go.GameObjects)
where EntityFunctions.DiffMilliseconds(DateTime.Now, g.EndDate) > 0
    && g.GameTypeId == (int)GameTypes.Lottery
    && g.GameStatusId == (int)GameStatues.Open
select new LotteryModel
{
    EndDate = g.EndDate,
    GameId = g.Id,
    PreviousGameEndDate = g.PreviousGame.EndDate,
    PreviousGameId = g.PreviousGameId.HasValue ? g.PreviousGameId.Value : 0,
    PreviousGameStartDate = g.PreviousGame.StartDate,
    PreviousWinningObjectCount = g.PreviousGame.GameObjects.Select(go => go.Object.Count).FirstOrDefault(),
    PreviousWinningObjectExternalVideoId = g.PreviousGame.GameObjects.Select(go => go.Object.Video.ExternalVideoId).FirstOrDefault(),
    PreviousWinningObjectName = g.PreviousGame.GameObjects.Select(go => go.Object.Video.Name).FirstOrDefault(),
    StartDate = g.StartDate,
    WinningObjectCount = g.GameObjects.Select(go => go.Object.Count).FirstOrDefault(),
    WinningObjectExternalVideoId = g.GameObjects.Select(go => go.Object.Video.ExternalVideoId).FirstOrDefault(),
    WinningObjectName = g.GameObjects.Select(go => go.Object.Video.Name).FirstOrDefault()
};

Однако я не хочу использовать это, потому что яТеперь нужно создать отдельный объект LotteryModel, чтобы вернуться на все остальные слои.

Я хотел бы иметь возможность вернуть сущность типа "Game", которая имеет все навигационные методы, ко всем другим моим данным (PreviousGame, GameObjects и т. Д.), А затем сопоставить необходимые свойства с моей квартирой.посмотреть модель, но когда я делаю это, кажется, только ленивая загрузка объектов, а затем у меня есть дополнительные попадания в БД.

Или я ошибаюсь, и всякий раз, когда мне нужно вернуть иерархические данные, я должен возвращать их через мой запрос LINQ в выбранной части?

Моя основная цель - уменьшить попадания в БД,

Ответы [ 2 ]

3 голосов
/ 26 сентября 2011

Я не совсем понимаю проблему.Вы возвращаете свой объект Игры, и вы можете получить доступ к свойствам и подобъектам из него.Использование метода Include() говорит ему загружать то, что вам нужно, и не лениво загружать его.

Убедитесь, что вы возвращаете один объект через .First, .FirstOrDefault, .Single, .SingleOrDefault илианалогичные методы.

0 голосов
/ 26 сентября 2011

Я закончил с этим запросом (к вашему сведению, я использую пространство имен System.Data.Objects для расширения Include):

(from g in _context.Games.Include(pg => pg.PreviousGame.GameObjects.Select(o => o.Object.Video))
    .Include(go => go.GameObjects.Select(o => o.Object.Video))
where EntityFunctions.DiffMilliseconds(DateTime.Now, g.EndDate) > 0
    && g.GameTypeId == (int)GameTypes.Lottery
    && g.GameStatusId == (int)GameStatues.Open
select g).FirstOrDefault();

Я думаю, мне просто нужно было включить больше иерархии ине знаю, могу ли я использовать Select () в функции Include ()!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...