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被更新,以滿足需求你的項目。