EF存储过程映射到复杂的ViewModel

时间:2015-09-11 14:33:54

标签: c# entity-framework

是否可以将ViewModel映射到数据库并将结果映射到复杂的ViewModel?

我需要执行一个只返回相关数据到我视图的存储过程,并将其作为LINQ查询执行,并且实际的映射模型缺乏性能。

假设我的课程类似于:

public class Class1Vm
{
    /* some properties */
    public Class2Vm Child1 {get;set;}
}

public class Class2Vm
{
    /* some properties */
    public Class3Vm Child2 {get;set;}
}

/* and so on */

存储过程就是这样的

SELECT   c1.Property1,
         c1.Property2,
         c2.Property1 AS [Child1.Property1],
         c2.Property2 AS [Child1.Property2],
         c3.Property1 AS [Child1.Child2.Property1],
         c3.Property2 AS [Child1.Child2.Property2],
FROM     Class1 c1
         JOIN Class2 c2 ON c2.Id = c1.Id
         JOIN Class3 c3 ON c3.Id = c2.Id

执行以下内容,Class1的所有属性都会自动成功映射:

var query = db.Database.SqlQuery<Class1Vm>("EXEC [MyStoredProcedure]").ToList();

我尝试将“[Child1.Property1]”作为尝试自动将EF映射到我的viewmodel,但事实并非如此。

感谢您的帮助。

这段代码只是执行存储过程时我需要做的一个例子,我的viewmodel比这复杂得多。

1 个答案:

答案 0 :(得分:2)

AFAIK无法在不创建平面表结构的情况下将存储过程输出映射到嵌套复杂类型,然后在代码中重新映射它。

如果您有外连接,请注意不要进入平面表结构,即应用程序和SQL Server之间会有大量冗余行和数据传输。

在这种情况下,您可以使用Entity Framework的多个结果集功能。没有EDMX Designer支持,但可以通过手动编辑EDMX文件来实现。您可以找到说明here

如果要读取的结果集超过2个,则需要从GetNextResult调用中缓存结果对象,并使用该结果对象再次调用GetNextResult