我整理了一些帮助程序,允许我按类型注册包含内容。看起来像这样:
Dictionary<Type, LambdaExpression[]> includes =
new Dictionary<Type, LambdaExpression[]>();
我注册的内容如下:
public void Add<T>(params Expression<Func<T, object>>[] includes)
{
this.includes.Add(typeof(T), includes);
}
Add<Customer>(e =>
e.Address.City.Province.Country,
e.Products.Select(p => p.Category));
请注意,客户
有两个包含项。然后我有一个按类型包含的方法:
DbSet<T> entitySet = null;
void LoadIncludes()
{
var includes = Includes.Instance.Get<T>().DirectCast<Expression<Func<T, object>>[]>();
if (includes != null)
{
foreach (var include in includes)
{
entitySet.Include(include).Load();
}
}
}
获取我的实体时,我这样做:
public T GetById(int id)
{
LoadIncludes();
return entitySet.SingleOrDefault(x => x.Id == id);
}
它工作得很好,但是太慢了,这是因为我在 LoadIncludes()
中调用了 .Load()
方法。有没有更快的方法来完成我想做的事情?
最佳答案
您不应该调用Load
,但构建并使用 Queryable<T>
与 Include
链。
替换LoadIncludes
具有私有(private)功能:
private IQueryable<T> GetEntitySet()
{
var set = entitySet.AsQueryable();
var includes = Includes.Instance.Get<T>().DirectCast<Expression<Func<T, object>>[]>();
if (includes != null)
{
foreach (var include in includes)
{
set = set.Include(include);
}
}
return set;
}
并按如下方式使用它:
public T GetById(int id)
{
return GetEntitySet().SingleOrDefault(x => x.Id == id);
}
关于entity-framework-6 - 动态添加多个包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41879532/