【发布时间】:2014-10-29 10:53:39
【问题描述】:
所以,我有一个相当大的关系数据库,我正在使用 C#/.Net 中的 EntityFramework 驱动它。我正在尝试对其进行优化,以使其更好地仅获取选定的数据。
在尝试限制任何数据之前,我使用.AsNoTracking() 作为存储库的bool 输入。
到目前为止,我一直在使用所有相关表都包含在查询中的存储库,即使我只想搜索某些内容。
在返回IQueryable<Product> 之前,我基本上得到了大量的.Include(...) 列表。
但是假设我只想返回几个特定的表(因为这些是我唯一需要显示某些数据的表),那么最好的方法是什么?
到目前为止,我的存储库为该实体可用的关系接收了一个枚举值列表。
我已经实现了遍历这个列表,并尝试对每个所需的关系执行.Include(...),但这似乎比加载所有内容花费的时间要长得多(有时,甚至超时并给我一个 SQL 超时)。下面是一个简短的 sn-p。
query 是 IQueryable<Product>
foreach (var part in this.IncludeList)
{
switch(part)
{
case ProductPart.Tag:
query = query.Include(p => p.Tags);
break;
case ProductPart.Video:
query = query.Include(p => p.Videos);
break;
}
}
是否有使用我缺少的链外的诀窍?
【问题讨论】:
-
是否可以在数据库上跟踪生成的查询?我们最近遇到了一个类似的问题,即 Entity Framework 通过延迟加载获取所有子实体,即使我们使用了 Include。我们可以通过设置 Context.Configuration.LazyLoadingEnabled = false; 来解决这个问题。在此链接中找到:stackoverflow.com/questions/16798796/…
-
@BrunoV 感谢您的评论!不幸的是,我认为这行不通。我已经使用完全相同的代码块
this.Context.Configuration.LazyLoadingEnabled = false;关闭了延迟加载,这可能是我使用return query.AsQueryable();造成的,所以我可以使用延迟执行吗?
标签: c# linq entity-framework optimization