2012-03-18 31 views
3

(免責事項 - 。。私は、データベース設計者ではないよ、私はこの仕事をするために持っているものだけが悪い開発者です)Entity Frameworkのストアドプロシージャ一時テーブルを返す問題

17は、(現時点では)あります。同じ構造のテーブル - 名前、住所、電話番号電話番号が与えられ

は、私がそのアドレスを返し、その後、テーブルのいずれかに一致するエントリがあるかどうかを確認する必要があります。

だから、私はテーブル(その情報を保持している参照テーブルがあります)のリストを取得するためにビューを作成し、その後、私はカーソルを使用して

    1. 一時テーブルを作成するストアドプロシージャを作成しましたSQL結合を使用して、ビュー内の各表で電話番号を確認します。レコードが見つかった場合は、それを一時テーブルに挿入します。
    2. 一時テーブルから行を戻します。

    ストレートT-SQLでこのすべての作品。

    今、私は、ストアドプロシージャを呼び出すために、Entity Frameworkの4+を使用しようとしています。しかし、関数のインポートインターフェイスは列を生成しません。 return type = noneと表示され、LINQコードはintを想定してコンパイルされません。

    この作品を作成する方法についてのご意見はありますか?

    私は絶対にしなければならない場合、私は、コードにチェックテーブルの一部を移動することができます知っているが、私はむしろ、上記の方法の仕事を持っていると思います。

  • 答えて

    0

    私はEFの一部に対する解決策を知りませんが、データベースに私は次のビューを作成したい:

    select * from Table1 
    union all select * from Table2 
    union all select * from Table3 
    union all select * from Table4 
    ... 
    

    は、その後、あなたが好きしかし、ビューを照会するためにEFを使用することができます。カーソルなどの必要はありません。ストアドプロシージャに関する情報を取得する

    +0

    をヒットすることはありませんが、その後、私は、ビューごとに一週間かそこらで、彼らはテーブルを追加するたびに、変更する必要があるだろう。にもかかわらず、彼らは他の理由で既にテーブルのリストを持つrefテーブルを保持しています。 – kaplooeymom

    +0

    sprocは、例えば15分ごとにビュー定義を再生成できます。その視点は15分以内で正確になります。カーソルソリューションに固執したい場合は、コードを投稿してください。 – usr

    +0

    新しいテーブルの作成プロセスを変更してビューを更新できるので、このオプションを使用します。これはEFを幸せに保ちます。 – kaplooeymom

    4

    EFのデフォルトの方法は、「メタデータ」を要求する - それは、クエリやデータ変更コマンドを実行しません。そのため、EFは、一時表、dynaimc SQLなどを使用してストアドプロシージャに関する情報を受け取ることができません。これは、コマンドが実際に実行されるまでこれらの情報が不明であるためです。

    あなたの手順を変更し、冒頭にできる回避策は、あなたのデータベースにストアドプロシージャをインポートし、ストアドプロシージャがで変更を加えていないことを確認してみた場合にのみ、これを使用し

    SET FMTONLY OFF 
    

    を置くとこれらの変更は、エンティティ・モデルのストアド・プロシージャをインポートまたは更新しようとするたびに実行されるためです。

    2

    これは総ハックですが、私は複雑なストアドプロシージャを持つエンティティフレームワークを使用するために、過去にそれを使用しています。エンティティフレームワークがNULLパラメータ値を使用して、返されたデータセットをミラーリングする型を作成するという利点があります。単純なIF(パラメータはNULL)と返すデータと一致する偽の戻りデータセットを行います。コードのこの非論理ブロックを追加

    ALTER proc [dbo].[cust_auto_doc_list_invoice] 
    @interval_ref integer 
    AS 
    SET NOCOUNT ON; 
    
    IF @interval_ref IS NULL 
    BEGIN 
    -- This is to fool the edmx generator. 
        SELECT CONVERT(integer,0) as group_ref, 
         CONVERT(varchar(50),'') as group_name, 
         CONVERT(integer,0) as wloc_ref, 
         CONVERT(decimal(18,0),0) as invoice_ref, 
         CONVERT(decimal(10,0),0) as cust_ref, 
         CONVERT(varchar(50),'') as cust_name, 
         CONVERT(decimal(10,0),0) as csnee_ref, 
         CONVERT(varchar(50),'') as csnee_name 
    END 
    ELSE 
    BEGIN 
        -- Do real work here 
    END 
    

    -tom

    関連する問題