Rac*_*hel 8 c# entity-framework entity-framework-4
我有一个包含5个独立表的Entity Framework项目.当我从这些表中查询和使用数据时.Include()
,它生成的查询非常慢并且超时.
我已将查询移动到存储过程,现在正在寻找一种查询此存储过程的方法,并轻松地将它返回的数据映射到现有数据类.
我对EF的DataContext的原始Linq查询如下所示:
var data = (from a in context.A
.Include("B")
.Include("C")
.Include("D")
.Include("E")
where a.Id == someValue
select a);
Run Code Online (Sandbox Code Playgroud)
它返回一个类似于此的Entity数据对象:
class A
{
int Id;
string otherProperties;
List<B> B;
List<C> C;
List<D> D;
List<E> E;
}
Run Code Online (Sandbox Code Playgroud)
EF生成在SQL服务器上运行的查询返回的结果集如下所示:
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 ---------------------------------------------------------- A1 A2 B1 B2 A1 A2 C1 C2 A1 A2 C1 C2 A1 A2 C1 C2 A1 A2 D1 D2 A1 A2 D1 D2 A1 A2 D1 D2 A1 A2 E1 E2 A1 A2 E1 E2
(假设1 B记录,3 C记录,3 D记录和2 E记录.
我已经在存储过程中重现了这个查询并将其运行时减少到几乎没有,但是我仍然试图弄清楚如何将结果集映射到我的Entity Framework数据类(A
上面的类).
EF肯定能够做到这一点,因为当我使用Linq查询时它已经在幕后的某个地方,但我不确定这是否是我可以访问的内容.
在Entity Framework中有一种简单的方法可以将单个存储过程(Function Import)映射到多级Entity Framework类吗?
我找到了一篇博客文章,解释了如何使用实体框架来完成此操作。
简而言之,您需要编写存储过程,以便它以实体框架期望的特定方式返回数据,然后您可以使用一些EF 扩展来自定义存储过程执行,并具体化对象图。
看起来这是在未来版本(我相信是 5.0+)中内置于实体框架中的,但是这个解决方法看起来应该适用于较低版本。
尽管就我而言,我发现如果我只是摆脱了.Include()
Linq 查询中的 并在返回对象之前通过在代码中引用其他属性来手动触发加载它们,我的性能问题就得到了解决。这是因为它不是在具有未优化连接的 5 个表之间构建一个大规模查询,而是运行 5 个单独的查询,每个查询仅提取其所需的特定数据。
归档时间: |
|
查看次数: |
1305 次 |
最近记录: |