4

私は .NET 4.5 で EF 5 を使用しています。データベースのモデルを作成し、関数をモデルにインポートしました。TVF と SP を正常にインポートできますが、スカラーの戻り値を持つ関数をインポートできません。デザイナーで可能ですか、それともファイルを手動で編集する必要がありedmxますか?

4

3 に答える 3

8

このページのスカラー値関数のセクションまで下にスクロールします。

Entity Framework 5 を使用したデータベース ファースト開発 - スカラー値関数のインポート

この醜い回避策に従うか、この回答の一番下にあるアドバイスに従うことができます。

その記事からの抜粋です(回避策について):

「この方法では、.edmx ファイルの xml を直接少し変更する必要があります。これを行うには、.edmx ファイルを右クリックし、[開く]、[XML (テキスト) エディター] の順に選択します。これが関数の外観です。変更前の .edmx ファイル:

<Function Name="CountActivities" ReturnType="int" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
    <Parameter Name="personId" Type="int" Mode="In" />
</Function>
<Function Name="CountHydrations" ReturnType="int" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
    <Parameter Name="personId" Type="int" Mode="In" />
</Function>
<Function Name="CountMeals" ReturnType="int" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
    <Parameter Name="personId" Type="int" Mode="In" />
</Function>

「要素から 'ReturnType' 属性を削除します。次に、各要素に要素を追加します。要素の内容については、以下の変更された .edmx ファイルを参照してください。

<Function Name="CountActivities" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
    <CommandText>
        SELECT [dbo].[CountActivities] (@personId)
    </CommandText>
    <Parameter Name="personId" Type="int" Mode="In" />
</Function>
<Function Name="CountHydrations" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
    <CommandText>
        SELECT [dbo].[CountHydrations] (@personId)
    </CommandText>
    <Parameter Name="personId" Type="int" Mode="In" />
</Function>
<Function Name="CountMeals" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
    <CommandText>
        SELECT [dbo].[CountMeals] (@personId)
    </CommandText>
    <Parameter Name="personId" Type="int" Mode="In" />
</Function>

次に、モデル ブラウザーで、[関数のインポート] フォルダーを右クリックし、[関数のインポートの追加] を選択します。これにより、[関数のインポートの追加] ダイアログ ウィンドウが表示されます。このメソッドを表示します。ダイアログ ウィンドウに次の情報を入力し、[保存] を選択します。」

私のアドバイス:必要な労力を考慮すると、1 行だけを返すテーブル値関数を作成して、同じ効果と目的を達成する 方がはるかに簡単です。

SQL Server でのユーザー定義のテーブル値関数の例を次に示します。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[udfGetTotalMinutesInvoiced] ( @billingType INT )
RETURNS TABLE
AS
RETURN
    (
      SELECT
            SUM([ProgressNote].[TotalMinutes]) AS 'TotalMinutesInvoiced'
        FROM
            [dbo].[InvoiceEntry]
        JOIN [dbo].[ProgressNote]
            ON [ProgressNote].[ProgressNoteID] = [InvoiceEntry].[ProgressNoteID]
        WHERE
            [InvoiceEntry].[BillingTypeID] = @billingType
            AND progressNote.[IsRecordedInInvoiceEntry] = 1
    )
GO

テーブル値関数内からスカラー値のユーザー定義関数を実際に呼び出すこともできます。

テーブル値関数を呼び出すには、次のように FirstOrDefault メソッドを使用することをお勧めします。

        private void UpdateStatisticsPanel()
        {
            var billingTypeId = int.Parse(txtBillingTypeId.Text);

            var totalMinutesInvoiced = context.udfGetTotalMinutesInvoiced(billingType: billingTypeId);
            var minutesInvoiced = totalMinutesInvoiced.FirstOrDefault();
            var invoiced = new Tuple<string, int?>("totalMinutesInvoiced:", minutesInvoiced);
            lstFinancialSummary.Items.Add(invoiced);

            var totalMinutesNotInvoiced = context.udfGetTotalMinutesNotInvoiced(billingType: billingTypeId);
            var minutesNotInvoiced = totalMinutesNotInvoiced.FirstOrDefault();
            var notInvoiced = new Tuple<string, int?>("totalMinutesNotInvoiced:", minutesNotInvoiced);

            lstFinancialSummary.Items.Add(notInvoiced);
            // remember to push the values up to the ListView.
        }
于 2014-09-10T05:29:50.947 に答える