实体框架代码首先存储过程与多个结果集和自定义实体

本文关键字:实体 结果 自定义 框架 代码 存储过程 | 更新日期: 2023-09-27 18:13:10

我的存储过程返回两组结果。ProductSearchResult和ProductSizeResult不是实体在我的情况下,因此我得到一个例外的EntitySet名称'数据库。未能找到产品搜索结果。

我不想在dbcontext中为我的每个过程结果创建Entity,是否有任何解决方案将存储过程映射到自定义对象。

        try
        {
            DbContext.Database.Connection.Open();
            DbDataReader reader = cmd.ExecuteReader();
            result = ((IObjectContextAdapter)DbContext).ObjectContext.Translate<ProductSearchResult>(reader, "ProductSearchResult", MergeOption.AppendOnly).ToList();
            reader.NextResult();
            productSizeResults = ((IObjectContextAdapter)DbContext).ObjectContext.Translate<ProductSizeResult>(reader, "ProductSizeResult", MergeOption.AppendOnly).ToList();
        }
        catch (Exception ex)
        {
            log.Error(ex);
        }
        finally
        {
            DbContext.Database.Connection.Close();
        }

自定义实体,

public class ProductSearchResult
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int AvailableQuantity { get; set; }
    public int Price{ get; set; }
}
public class ProductSizeResult
{
    public int Id { get; set; }
    public string Size { get; set; }
    public int Count { get; set; }
}

My Stored Procedure,

ALTER PROC GetProductResult @PrimaryCategory nvarchar(100)
AS
select P.Id
,P.Name
,PI.AvailableQuantity
,PI.Price
from Products P
inner join ProductInventories PI on P.Id = PI.ProductId
--where clause
select CA.Name Size,count(1) Count 
from Products P
inner join ProductInventories PI on P.Id = PI.ProductId
inner join CustomAttributes CA on PI.CustomAttributeID = CA.Id
--where clause
group by CA.Name

实体框架代码首先存储过程与多个结果集和自定义实体

根据MSDN:

Translate方法使您能够执行标准的ADO。. NET查询一个数据源,并将返回的数据行转换为实体对象。

(重点)

这意味着类型ProductSearchResultProductSizeResult必须是映射类型(实体类型)。这个事实已经或多或少地被MergeOption参数揭示出来了。这是关于如何将对象添加到更改跟踪器,这对于非实体类型没有意义。