2012-03-28 17 views
0

は、スケーラ値 を作成する方法とコードにアクセスする方法をedmxに返す1つの関数を作成しますか?作成とユーザー定義関数edmx

+0

私はセクションにmy sqlクエリを定義し、それをiscomposable = trueとして設定するssdlにタグを追加しますが、機能しませんでした。製品IDに基づいてテーブルから製品名を取得したいだけです。 –

答えて

0

問題は、「EntityModelGenerator」によってSSDLが自動的に生成されることです。そのため、編集は再構築によって消去されます。あなたの編集はEDMXファイルで行う必要があります。

まず、戻り値として、ソートの計算(つまり、データベースレベルではなくアプリケーションで値を加算する)、または(2)データベースへの直接呼び出しかどうかを判断する必要がありますストアドプロシージャ?

は、(1)最初のステップは、EDMXファイルに関数XML定義を追加することです:

<Function Name="LineTotal" ReturnType="decimal"> 
    <Parameter Name="lineTotal" Type="MyDbModel.OrderDetail"> 
    <DefiningExpression> 
     od.Price * od.Quantity 
    </DefiningExpression> 
    </Parameter> 
</Function> 

今、あなたのEDMXはこの機能については、お使いのIntelliSenseはないでしょう知っているが。したがって、この作業をするためにいくつかのコードを追加する必要があります。これらの機能を別々のクラスに配置することがベストプラクティスです。

public class ModelDefinedFunctions 
{ 
    [EdmFunction("MyDbModel" , "LineTotal")] //Model Name and Function Name 
    public static decimal LineTotal(OrderDetail od) 
    { 
     throw new NotSupportedException("LineTotal cannot be directly used."); 
    } 
} 

Entity Frameworkの代わりにEDMXにこの関数呼び出しをリダイレクトするために知っているだろう。モデルが存在しない場合、このメソッドを直接呼び出すと例外がスローされます。

あなたは、あなたが直接、ストアドプロシージャを追加する場合(2)、EDMXデザイナにドラッグアンドドロップすることが容易である

var productValues = from line in model.OrderDetails 
        select new 
        { 
         od.ProductID, 
         od.Price, 
         od.Quantity, 
         LineTotal = ModeDefinedFunctions.LineTotal(line) 
        }; 

のようなあなたのLINQクエリでそれを呼び出すことができます。 [FunctionImport()]属性がありますが、私はそれを使用していません。ドラッグアンドドロップして、EDMXファイルで生成するコードを確認できますか?

または、model.ExecuteCommand(<spname> , params object[] values )ストアドプロシージャの実行メソッドを呼び出すことができます。