EntityFramework Poco LoadProperty过滤

时间:2010-12-05 07:51:26

标签: entity-framework filtering poco

在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 个答案:

答案 0 :(得分:3)

就像它提到的那样,如果你想要任何类型的自定义导航属性加载(例如过滤或排序),那么就不能使用内置的显式急切/延迟加载方法(例如加载)。由于您使用的是POCO,因此您只有两种选择:

使用匿名类型过滤投影:

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);
}

答案 1 :(得分:0)

您尝试做的似乎是改变您从Entity Framework获得的实体的定义。如果您只想为给定的相册填充10张照片,则应考虑更改或扩展模型,而不是在查询时尝试进行构建。

一个好的解决方案可能就像在对象上添加属性来执行您提到的过滤一样简单,并返回10个结果。