我正在将我的EF linq查询更改为存储过程.有没有简单的方法来设置复杂的映射?

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类吗?

Rac*_*hel 2

我找到了一篇博客文章,解释了如何使用实体框架来完成此操作。

http://blogs.infosupport.com/ado-net-entity-framework-advanced-scenarios-working-with-stored-procedures-that-return-multiple-resultsets/

简而言之,您需要编写存储过程,以便它以实体框架期望的特定方式返回数据,然后您可以使用一些EF 扩展来自定义存储过程执行,并具体化对象图。

看起来这是在未来版本(我相信是 5.0+)中内置于实体框架中的,但是这个解决方法看起来应该适用于较低版本。

尽管就我而言,我发现如果我只是摆脱了.Include()Linq 查询中的 并在返回对象之前通过在代码中引用其他属性来手动触发加载它们,我的性能问题就得到了解决。这是因为它不是在具有未优化连接的 5 个表之间构建一个大规模查询,而是运行 5 个单独的查询,每个查询仅提取其所需的特定数据。