0

プログラムに Entity Framework 4 エンティティ モデルがあります。SQL Anywhere 12.0.1 データベースで定義した次のストアド関数がありますGuidToPrefix

CREATE OR REPLACE FUNCTION GuidToPrefix( ID UNIQUEIDENTIFIER ) RETURNS INT AS
BEGIN
    RETURN CAST( CAST( ID AS BINARY(4) ) AS INT )
END;

このMSDN 記事の指示に従って、関数を EDMX に追加しました。

<Function Name="GuidToPrefix" ReturnType="int" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="DBA">
  <Parameter Name="ID" Type="uniqueidentifier" Mode="In" />
</Function>

正直なところ、データベースからモデルを更新し、ウィザードの最初のタブのリストで機能をチェックしました。それが違いを生むかどうかはわかりませんが、なぜそうなるのかわかりません。

記事によると、C# クラスに関数の定義を追加する必要があります。私の問題は、それをどのクラスに入れるかを教えてくれないことです。まったく新しいクラスを追加しますか? 新しい .CS ファイルを作成して、次のようにしますか?

public static DbFunctions {

    [EdmFunction( "CarSystemModel.Store", "GuidToPrefix" )]
    public static int GuidToPrefix( Guid id ) {
        throw new NotSupportedException( "Direct calls to GuidToPrefix are not supported." );
    }
}

それともエンティティクラスの部分に入れますか?

partial MyEntities {

    [EdmFunction( "CarSystemModel.Store", "GuidToPrefix" )]
    public static int GuidToPrefix( Guid id ) {
        throw new NotSupportedException( "Direct calls to GuidToPrefix are not supported." );
    }
}

このエンティティ モデルが使用されている 2 つのプロジェクトがあります。1 つはクラス ライブラリで、モデルはその中で定義されています。もう 1 つは、それを使用する別のソリューションの別のクラス ライブラリです。上記の両方の例を試しましたが、2 番目のクラス ライブラリのクエリは、どちらの場合もコンパイラからこのエラーを生成します。

The name 'GuidToPrefix' does not exist in the current context

明らかに、私は正しいことをしていません。誰かがこれを試して動作させましたか?

4

1 に答える 1

0

これに対する答えを見つけました。

エンティティ モデルが定義されているプロジェクトで MyEntities クラスの一部を含むファイルを作成したことを思い出してください。

partial MyEntities {

    [EdmFunction( "CarSystemModel.Store", "GuidToPrefix" )]
    public static int GuidToPrefix( Guid id ) {
        throw new NotSupportedException( "Direct calls to GuidToPrefix are not supported." );
    }
}

これは問題なく、すべてコンパイルされました。私の問題はここではありませんでしたが、関数を使用する必要があるプロジェクトにありました。

そのプロジェクトでは、 というクラスにDataInterface、次のようなコードのメソッドがあります。

var query = from read in context.Reads
            from entry in context.Entries
                                 .Where( e => GuidToPrefix( read.ID ) == e.PrefixID && read.ID == e.ID )
                 .....

問題は、句に GuidToPrefix 関数の C# 宣言を含むクラスの名前を追加する必要があることでしたWhere。つまり、上記の式を次のように書く必要がありました。

var query = from read in context.Reads
            from entry in context.Entries
                                 .Where( e => MyEntities.GuidToPrefix( read.ID ) == e.PrefixID && read.ID == e.ID )
                 .....

これはコンパイルされ、実行されると、データベース内の関数が必要に応じて使用されますLEFT OUTER JOIN

于 2012-11-29T20:19:41.727 に答える