通用包括

时间:2014-06-04 14:06:24

标签: c# linq entity-framework generics

我有一个泛型类,它有一个使用Find的Get方法从数据库中查找实体。它正在工作,但它不包括在对象中找到的其他实体。

示例:

public class GenericRepository<TEntity> where TEntity : class
{
    public virtual TEntity GetByID(object id)
    {
        return dbSet.Find(id);
    }
}

可以在检索到的对象中找到的实体(例如,名为User)可以找到一个实体,但它是null。当我返回对象时,我需要它。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您必须将导航属性标记为virtual

public class User 
{
    public int ChildID;
    public virtual Child ChildEntity;
}

virtual关键字将标记您的媒体资源,以便在访问时延迟加载。

答案 1 :(得分:0)

只要你可以延迟加载实体,标记的答案就会有效。

如果您想要急切地加载,那么另一种方法是编写包含如下函数的泛型:

public IQueryable<TEntity> Including(params Expression<Func<TEntity, object>>[] _includeProperties)
{
    IQueryable<TEntity> query = m_context.Set<TEntity>();
    return _includeProperties.Aggregate(query, (current, includeProperty) => current.Include(includeProperty));
}

可以用来实现类似的东西,唯一的问题是你必须知道要加载的相关实体。用法是这样的:

myEntity returnedEntity = myEntityRepository
                        .Including(x => x.Child1, x => x.Child2)
                        .FirstOrDefault(x => x.Id == id);