0

に複合型の移入しますプロパティ。私の手続きでは、私が使用するuspGetDetailsを言う:は、私は次のプロパティを持つ複合型SalesOrderHeaderを持つエンティティフレームワーク

最初の4つのプロパティを取得するための最初のステートメント。OrderNumber、CustomerName、CustomerNumber、PODate。第二には、以下の

第三選択プロパティ

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 

以下のようInvoiceNumberをフェッチするコメント

をフェッチするためにProprtyを選択し、

[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); 
} 

PROBLEM SalesOrderHeaderを移入するには、この手順を実行するための私の方法であり、 :これを実行すると、互換性のないデータを、関数import iとしてエラーが発生します。最初の問合せのみの結果をフェッチします。 2番目と3番目のクエリ、つまりコメントとInvoiceNumberの結果は選択されていません。

ストアドプロシージャの複数のクエリによって1つの複合型を設定することはできますか? そうでない場合、これを達成するもう1つの方法は何ですか?

答えて

1

EFの現在のバージョン(4.0)では不可能です。現在のバージョンでは、複数の結果セットを持つストアドプロシージャはサポートされていません(プロシージャ内で複数選択されています)。この機能は2011年6月のCTPでプレビューされ、EFv4.5(.NET 4.5の一部)の一部である必要があります。

現時点では、複数の結果セットを返すストアドプロシージャを使用する唯一の方法は、EFExtensionsを使用することですが、コードは多くてmore complicatedです。

0

請求書番号は実際に転記される前にSOP10100で実際には始まることに注意してください。 SOPNUMBEの請求書番号に対してSOP10100を最初に確認し、次に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 

、あなたはおそらくEFはの要求を満たすために更新されるまで、3種類のストアドプロシージャにこのストアドプロシージャを分割する必要があります。あなたのプロジェクト

関連する問題