EntityFramework Poco LoadProperty Фильтрация - PullRequest
4 голосов
/ 05 декабря 2010

В POCO я использую явную загрузку через LoadProperty для загрузки данных.Мне нужно отфильтровать и отсортировать данные из загруженного свойства и вернуть основной объект.

Скажем, есть класс альбома, фотографии которого являются коллекцией.Мне нужно вернуть объект "альбома" из DAL.Таким образом, код будет

public Album GetPhotos()
    {
        using (var context = new Entities())
        {
            //....code for loading album....
            context.LoadProperty(album, "Photos");
            //I need to return ONLY the latest 10 photos
            // album.Photos = album.Photos.OrderByDescending(a=>a.CreateDate).Take(10); //DOES NOT WORK
            return album;
        }
    }

Теперь в приведенном выше коде мне нужно вернуть только последние 10 фотографий, я не могу фильтровать или сортировать коллекцию фотографий, как показано в коде.Какой лучший способ справиться с этим?Даже если мы создадим новый объект, как бы мы скопировали всю информацию об альбоме в новый альбом?

Ответы [ 2 ]

3 голосов
/ 06 декабря 2010

Как уже упоминалось, если вы хотите иметь какую-либо настраиваемую загрузку свойств навигации (например, фильтрацию или упорядочение), то вы не можете использовать встроенные явные методы быстрой / отложенной загрузки (например, Load). Поскольку вы используете POCO, у вас есть только 2 варианта:

Отфильтрованная проекция с анонимными типами:

var album = context.Albums.Where(a => a.AlbumId == 1).Select(a => new  
{
    a,
    Photos = a.Photos.OrderByDescending(alb => alb.CreateDate).Take(10)
});

Возвращает анонимный тип, который не всегда желателен, в этом случае есть еще один способ:

Два отслеживаемых запроса:

Album album = context.Albums.Where(a => a.AlbumId == 1).Single();
List<Photo> photos = context.Photos
                            .Where(p => p.AlbumId == 1)
                            .OrderByDescending(a => a.CreateDate).Take(10)
                            .ToList();

foreach (Photo photo in photos)
{
    album.Photos.Add(photo);
}
0 голосов
/ 05 декабря 2010

Похоже, что вы пытаетесь изменить определение сущности, которое вы получаете из Entity Framework.Если вы хотите, чтобы для данного альбома было заполнено только 10 фотографий, вам следует подумать об изменении или расширении модели, а не пытаться создать эту конструкцию во время запроса.

Хорошее решение может быть таким же простым, как добавлениесвойство объекта, чтобы выполнить фильтрацию, о которой вы упоминали, и вернуть 10 результатов.

...