具有关系的实体框架自定义过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有关系的实体框架自定义过程相关的知识,希望对你有一定的参考价值。
我有一个名为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如何处理这个问题?
最后我发现,如果我想编写自定义过程,我应该有一个与输出相同的类,所以我创建一个类并用我自己的自定义过程填充它:
this.Database.SqlQuery<CustomClass>("exec dbo.CustomeProcedure").ToList();
但在我提到的这种情况下,我必须执行foreach和....来提取我的类及其属性(如另一个实体的列表)。写入需要时间,但执行时间显着改善。在之前的情况下,当我使用EF include()时,它需要大约2000毫秒,但现在需要大约300毫秒的所有foreach和转换我已经完成...
我认为EF在其中一个层面上做同样的事情(我的意思是将sp转换为类)。
以上是关于具有关系的实体框架自定义过程的主要内容,如果未能解决你的问题,请参考以下文章
使用自定义 ID 插入数据的 Code-First 实体框架
实体框架 - 您能否将导入的存储过程的结果类型映射到自定义实体类型?
使用带有 OData 提要 C# 的存储过程的自定义分页,没有实体框架