如何创建通用存储库a';深度包含';

本文关键字:包含 深度 存储 何创建 创建 | 更新日期: 2023-09-27 18:26:21

我在EF Codefirst之上创建了一个Generic存储库,其中包含一些方法,效果非常好。Get方法看起来像这样(这包括一个级别)

public virtual IEnumerable<T> Get(
        Expression<Func<T, bool>> filter = null,
        Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
        string includeProperties = "") 
{
        IQueryable<T> query = _dDbSet;
        if (filter != null)
            query = query.Where(filter);
        query = includeProperties.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Aggregate(query, (current, includeProperty) => current.Include(includeProperty));
        return orderBy != null ? orderBy(query).ToList() : query.ToList();
    }

但当我需要通用存储库来返回"更深层次"的include 时,我偶然发现了一个问题

例如:一个Hotel对象与一个房间列表有关系,每个房间都与人有关系。

我希望我的方法返回一个Hotel对象,其中包含与这些房间相关的人的房间列表。

如何使用GenericRepository解决此问题?

我不想使用解决方案:

    var hotel = _hotelRepository.Context.Hotels.Where(p => p.HotelId == HotelId).Include(p => p.RoomList.Select(b => b.Person)).First();

在我的总线类中,因为我想分离对genericRepository的数据访问,并能够在我的测试项目中模拟出该方法。

有没有一个好的解决方案,或者我必须使用上面提到的Select上下文?

谢谢!

如何创建通用存储库a';深度包含';

我闻到了内平台效果。您正试图让您的通用存储库做EF所做的一切。为什么不直接使用EF(或您使用的任何ORM)?

就我个人而言,我不久前就放弃了自己的存储库。我通过在"report"类中直接使用ORM来封装可重用查询。对于更简单的一次性查询,我直接使用ORM。当我编写报表类或直接查询时,我知道应该急切地包含/获取什么等等,并且可以使用ORM提供的工具。

请记住:您的ORM已经是存储库,无需包装(IMO)。

请参阅http://ayende.com/blog/3955/repository-is-the-new-singleton