一尘不染

EF包括其他实体(通用存储库模式)

c#

我在Entity Framework Code
First之上使用通用存储库模式。一切工作正常,直到我需要在查询中包含更多实体。我必须成功包含一个实体,但是现在我不知道如何包含多个实体。看看到目前为止我得到了什么:

public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
{
    var entityName = GetEntityName<TEntity>();
    return _objectContext.CreateQuery<TEntity>(entityName);
}

public IList<TEntity> GetQueryWithInclude<TEntity>(string toInclude) where TEntity : class
{
    var entityName = GetEntityName<TEntity>();
    return _objectContext.CreateQuery<TEntity>(entityName).Include(toInclude).ToList();
}

private string GetEntityName<TEntity>() where TEntity : class
{
    return string.Format("{0}.{1}", _objectContext.DefaultContainerName, _pluralizer.Pluralize(typeof(TEntity).Name));
}

我试图做但没用的是将字符串数组传递给函数,然后尝试将“包含”附加到查询顶部。我想知道如果我一次调用GetQueryWithInclude并一次传递一个实体名称(实际上是一个导航属性)来聚合查询结果该怎么办,但是我担心这可能会在每次调用时重复查询的结果…您认为什么是使它正常工作的最佳方法?

提前致谢!

更新:

这是我要实现的目标的一个示例:

public IQueryable GetQueryWithIncludes(string[] otherEntities)
{
    var entityName = GetEntityName<TEntity>();
    //now loop over the otherEntities array 
    //and append Include extensions to the query
    //so inside the loop, something like: 
    _objectContext.GetQuery<TEntity>(entityName).Include(otherEntities[index]);
}

阅读 315

收藏
2020-05-19

共1个答案

一尘不染

仅在IQueryable上使用Include扩展。在EF 4.1组件中可用。如果您不想在上层引用该程序集,请在数据访问程序集中创建包装器扩展方法。

这里有例子:

public static IQueryable<T> IncludeMultiple<T>(this IQueryable<T> query, params Expression<Func<T, object>>[] includes)
    where T : class
{
    if (includes != null)
    {
        query = includes.Aggregate(query, 
                  (current, include) => current.Include(include));
    }

    return query;
}

您将使用它作为示例,例如:

var query = context.Customers
                   .IncludeMultiple(
                       c => c.Address,
                       c => c.Orders.Select(o => o.OrderItems));

该查询将向所有客户加载他们的地址和订单,并且每个订单都将包含其订单项。

2020-05-19