2017-03-10 11 views
0

標準インポート・メカニズムを使用することができません。構成可能なファンクションはファンクションのインポート・リストに表示されないためです。しかし、私はこのように動作するスカラー値を返す関数を得ることができた:エンティティ・フレームワークとPostgresql:ストアド・プロシージャからレコードを戻す

"選択された関数とストアドプロシージャのインポート..."を選択せず​​に "データベースからの更新モデル"を使用する。これはedmx-fileに関数の項目を生成します。これは正しい戻り値の型を手動で変更します。

<Function Name="get_customer_name" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="public" ReturnType="text"> 
     <Parameter Name="p1" Type="bigint" Mode="In" /> 
    </Function> 

は、その後、私は、次のクラス定義を追加します。この後

public class DBFunctions 
{ 
    [EdmFunction("dbNamespace.Store", "get_customer_name")] 
    public static string GetCustomerName(long id) 
    { 
     throw new NotSupportedException("Direct calls are not supported."); 
    } 
} 

を、私は私のクエリでDBFunctions.GetCustomerName(id)を呼び出すことができます。

しかし、私はどのように複雑なタイプでこの作業を行うことができますか?たとえば、postgresqlのように定義されたcustomer_addressという名前の型(コード整数、アドレステキスト)があり、戻り値の型がcustomer_addressのget_customer_address(id)という関数があるとします。クエリでその関数をどのように呼び出すことができますか?たとえば、私は書くことができるようにしたい

var addressList = (from customer 
        select GetCustomerAddress(customer.id)).ToList(); 

ここでGetCustomerAddressはカスタムAddressオブジェクトを返します。返された列とクラス属性の間のマッピングを提供するにはどうしたらいいですか、edmx-fileの正しい戻り値の型は何ですか?

答えて

0

質問の最初の半分は簡単な例で答えることができます。 int(I)およびテキスト列(T)を返す格納されたproc my_stored_procがあるとします。

あなたのC#でのクラスは次のようになります。これは、

アダムを助け

{ 

    // In reality you'd put a where clause in here and use parameters to limit the results 
    string myQuery = "select * from my_stored_proc()" 

    var listResultSet = database_context.Database.SqlQuery<MyClass>(myQuery).ToList(); 

} 

希望:あなたのオブジェクトにロードするには

public class MyClass 
{ 

    public int I 
    { 
     get; 
     set; 
    } 

    public string T 
    { 
     get; 
     set; 
    } 

} 

あなたはこのようなあなたのストアドプロシージャを呼び出すとは。

+0

ありがとうございますが、クエリで使用するedm関数である必要があります。 – eko

関連する問題