0

我有以下性质的复杂类型的SalesOrderHeader: ORDERNUMBER 客户名称 CUSTOMERNUMBER PODate 评论 发票编号填充在实体框架的复杂类型

我已经创建了一个存储过程(功能进口)来填充这些属性。在我的程序中说uspGetDetails我使用:

首先选择语句来获取前4个属性OrderNumber,CustomerName,CustomerNumber,PODate。

其次选择Proprty提取评论

第三选择属性获取InvoiceNumber如下

CREATE PROCEDURE uspGetHeaderDetails 
-- Add the parameters for the stored procedure here 
@OrderNumber CHAR(21) 
AS 
BEGIN 
DECLARE @Counter INT; 
DECLARE @OrignalNumber INT; 

SELECT @Counter = count(*) FROM sop10100 WHERE sopnumbe = @OrderNumber 

IF @Counter > 0 
BEGIN 
    SELECT TOP 1 sopnumbe [OrderNumber] 
     , custname [CustomerName] 
     , custnmbr [CustomerNumber] 
     , cstponbr [CustomerPhoneNumber] 
     , docdate [PODate] 
     , orignumb [OriginalNumber] 
    FROM sop10100 
    WHERE sopnumbe = @OrderNumber 
END 
ELSE 
BEGIN 
    SELECT TOP 1 sopnumbe [OrderNumber] 
     , custname [CustomerName] 
     , custnmbr [CustomerNumber] 
     , cstponbr [CustomerPhoneNumber] 
     , docdate [PODate] 
     , orignumb [OriginalNumber] 
    FROM SOP30200 
    WHERE sopnumbe = @OrderNumber 
END 

    SELECT cmmttext [Comments] 

    FROM sop10106 WHERE sopnumbe = @OrderNumber 

SELECT sopnumbe [InvoiceNumber] 

    FROM sop30200 WHERE orignumb = @OrderNumber 
END 

而下面是我的方法来执行这个过程来填充的SalesOrderHeader

[AcceptVerbs("POST")] 
public ActionResult SearchResult(FormCollection collection) 
{ 
    string orderNumber = collection["searchItem"].ToString(); 
    Models.SalesEntities db = new Models.SalesEntities(); 
    ObjectParameter[] parameters = new ObjectParameter[1]; 
    parameters[0] = new ObjectParameter("OrderNumber", orderNumber); 
    var headerResult = db.ExecuteFunction<Models.SalesOrderHeader>("uspGetHeaderDetails", parameters); 

    Models.SalesOrderHeader salesOrderHeader = new Models.SalesOrderHeader(); 
    salesOrderHeader = headerResult.SingleOrDefault(); 

    return View(salesOrderHeader); 
} 

问题:当我执行这个,我得到一个错误,说不兼容的数据,作为函数导入我只提取第一个查询的结果。没有选择第二个和第三个查询(即注释和发票号码)的结果。

是否有可能通过存储过程中的多个查询来填充一个复杂类型? 如果没有,那么完成这个的其他方法是什么?

回答

1

不,目前EF版本(4.0)无法使用。当前版本不支持具有多个结果集的存储过程(在过程中有多个选择)。此功能在2011年6月CTP预览,应该是EFv4.5(.NET 4.5的一部分)的一部分。

目前使用存储过程返回多个结果集的唯一方法是使用EFExtensions,但代码很多more complicated

0

请记住,您的发票号码实际上将在SOP10100开始发布之前开始。您需要首先检查SOP10100的SOPNUMBE中的发票号码,然后检查SOP30200。请记住,SOP10100是有效的SOP头表,而SOP30200是历史SOP头表。

IF EXISTS (SELECT 1 FROM SOP10100 WHERE ORIGNUMB = @OrderNumber) 
    BEGIN 
     SELECT SOPNUMBE [InvoiceNumber] 
     FROM SOP10100 WHERE ORIGNUMB = @OrderNumber 
    END 
ELSE 
    BEGIN 
     SELECT SOPNUMBE [InvoiceNumber] 
     FROM SOP30200 WHERE ORIGNUMB = @OrderNumber 
    END 

请注意我上面使用的IF声明。使用count(*)函数来确定您正在查找的记录是否在活动表中或历史记录表中的性能比所需的性能重要得多。同样的想法可以在初始查询中使用:

IF EXISTS (SELECT 1 FROM SOP10100 WHERE SOPNUMBE = @OrderNumber) 
    BEGIN 
     SELECT TOP 1 SOPNUMBE [OrderNumber] 
      , CUSTNAME [CustomerName] 
      , CUSTNMBR [CustomerNumber] 
      , CSTPONBR [CustomerPhoneNumber] 
      , DOCDATE [PODate] 
      , ORIGNUMB [OriginalNumber] 
     FROM SOP10100 
     WHERE SOPNUMBE = @OrderNumber 
    END 
    ELSE 
    BEGIN 
     SELECT TOP 1 SOPNUMBE [OrderNumber] 
      , CUSTNAME [CustomerName] 
      , CUSTNMBR [CustomerNumber] 
      , CSTPONBR [CustomerPhoneNumber] 
      , DOCDATE [PODate] 
      , ORIGNUMB [OriginalNumber] 
     FROM SOP30200 
     WHERE SOPNUMBE = @OrderNumber 
    END 

如由拉吉斯拉夫的答复中提到,你可能会需要打破这个存储过程分成3个不同的存储过程,直到EF被更新,以满足需求你的项目。