具有关系的实体框架自定义过程

问题描述 投票:0回答:1

我有一个名为MenuContainer的类

public partial class MenuContainer : IEquatable <MenuContainer>
{
    [Column("Id ")]
    [Key]
    public int Id { get; set; }

    public int MenuId { get; set; }

    public int WareId { get; set; }

    public int Price { get; set; }

    public virtual Menu Menu { get; set; }

    public virtual Ware Ware { get; set; }

    public bool Equals(MenuContainer other)
    {
        return (this.Id == other.Id && this.MenuId == other.MenuId && this.WareId == other.WareId);
    }
}

它与菜单有关系(每个菜单都有多菜单容器)。现在,当我想加载带有关系的MenuContainer时,我可以使用Include()。喜欢:

context.MenuContainers.Include("Menu").Include("Ware.WareCategory").Include("Ware.WareDescriptions.Description");

但我的问题是实体框架为此生成了长脚本(大约2000行代码的脚本和嵌套的选择和连接)所以我决定写这样的自定义程序:(不是我想要的只是简单的一个)

SELECT 
mc.MENU_CONTAINER_ID AS Id,
mc.MENU_ID AS MenuId ,
mc.WARE_ID AS WareId,
mc.WARE_PRICE_IN AS  Price,
mc.WARE_PRICE2_IN AS Price2,
m.MENU_NAME_VC AS Name,
m.MENU_DESCRIPTION_VC AS [Description]

FROM dbo.MENU_CONTAINER mc 
INNER JOIN dbo.MENU m ON m.MENU_ID = mc.MENU_ID

但是如何将我的脚本输出转换为MenuContainer类?

(你知道我应该用这个脚本的输出创建MenuContainer及其关系“Menu”)

我不想声明类,与我的脚本的输出相同,并使用类似的

            return this.Database.SqlQuery<CustomClass>(
            "exec dbo.CustomeProcedure").ToList();

并填充CustomClass然后执行很多foreach和groupby和...以生成我的MenuContainer类及其关系类

我该怎么办? EF如何处理这个问题?

entity-framework stored-procedures include relation
1个回答
0
投票

最后我发现,如果我想编写自定义过程,我应该有一个与输出相同的类,所以我创建一个类并用我自己的自定义过程填充它:

this.Database.SqlQuery<CustomClass>("exec dbo.CustomeProcedure").ToList();

但在我提到的这种情况下,我必须执行foreach和....来提取我的类及其属性(如另一个实体的列表)。写入需要时间,但执行时间显着改善。在之前的情况下,当我使用EF include()时,它需要大约2000毫秒,但现在需要大约300毫秒的所有foreach和转换我已经完成...

我认为EF在其中一个层面上做同样的事情(我的意思是将sp转换为类)。

© www.soinside.com 2019 - 2024. All rights reserved.