カスタム データベース関数を呼び出す方法How to: Call Custom Database Functions

ここでは、データベースで定義されたカスタム関数を LINQ Entities クエリから呼び出す方法について説明します。This topic describes how to call custom functions that are defined in the database from within LINQ to Entities queries.

LINQ to Entities クエリから呼び出されるデータベース関数は、データベース内で実行されます。Database functions that are called from LINQ to Entities queries are executed in the database. データベース内で関数を実行すると、アプリケーションのパフォーマンスが向上します。Executing functions in the database can improve application performance.

下に示す手順は、カスタム データベース関数を呼び出す方法の概要をまとめたものです。The procedure below provides a high-level outline for calling a custom database function. 各手順の詳しい説明は、その後の例で示します。The example that follows provides more detail about the steps in the procedure.

データベースで定義されるカスタム関数を呼び出すにはTo call custom functions that are defined in the database

  1. データベースにカスタム関数を作成します。Create a custom function in your database.

    SQL Server でカスタム関数を作成する方法の詳細については、「 CREATE FUNCTION (transact-sql)」を参照してください。For more information about creating custom functions in SQL Server, see CREATE FUNCTION (Transact-SQL).

  2. 関数を .edmx ファイルのストア スキーマ定義言語 (SSDL) で宣言します。Declare a function in the store schema definition language (SSDL) of your .edmx file. 関数の名前は、データベースで宣言される関数と同じ名前にする必要があります。The name of the function must be the same as the name of the function declared in the database.

    詳細については、「 Function 要素 (SSDL)」を参照してください。For more information, see Function Element (SSDL).

  3. 対応するメソッドをアプリケーション コードのクラスに追加して、EdmFunctionAttribute をそのメソッドに適用する必要があります。属性の NamespaceName パラメーターと FunctionName パラメーターが、それぞれ概念モデルの名前空間名と概念モデルの関数名であることに注意してください。Add a corresponding method to a class in your application code and apply a EdmFunctionAttribute to the method Note that the NamespaceName and FunctionName parameters of the attribute are the namespace name of the conceptual model and the function name in the conceptual model respectively. LINQ の関数名解決では、大文字と小文字が区別されます。Function name resolution for LINQ is case sensitive.

  4. LINQ to Entities クエリからメソッドを呼び出します。Call the method in a LINQ to Entities query.

Example

次の例は、カスタム データベース関数を LINQ to Entities クエリから呼び出す方法について説明します。The following example demonstrates how to call a custom database function from within a LINQ to Entities query. この例では、School モデルを使用します。The example uses the School model. School モデルの詳細については、「 School サンプルデータベースの作成」および「 school .Edmx ファイルの生成」を参照してください。For information about the School model, see Creating the School Sample Database and Generating the School .edmx File.

次のコードは、AvgStudentGrade 関数を School のサンプル データベースに追加しています。The following code adds the AvgStudentGrade function to the School sample database.

注意

カスタム データベース関数を呼び出す手順は、データベース サーバーとは無関係にすべて同じです。The steps for calling a custom database function are the same regardless of the database server. ただし、下に示すコードは、SQL Server データベースで関数を作成する方法に固有のものです。However, the code below is specific to creating a function in a SQL Server database. 他のデータベース サーバーでカスタム関数を作成する場合には、コードは異なることがあります。The code for creating a custom function in other database servers might differ.

USE [School]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[AvgStudentGrade](@studentId INT)
RETURNS DECIMAL(3,2)
AS
    BEGIN
    DECLARE @avg DECIMAL(3,2);
    SELECT @avg = avg(Grade) FROM StudentGrade WHERE StudentID = @studentId;

    RETURN @avg;
END

Example

次に、 .edmxファイルのストアスキーマ定義言語 (SSDL) で関数を宣言します。Next, declare a function in the store schema definition language (SSDL) of your .edmx file. 次のコードは、SSDL の AvgStudentGrade 関数を宣言しています。The following code declares the AvgStudentGrade function in SSDL:

<Function Name="AvgStudentGrade" ReturnType="decimal" Schema="dbo" >
  <Parameter Name="studentId" Mode="In" Type="int" />
</Function>

Example

ここで、メソッドを作成し、SSDL で宣言された関数にマップします。Now, create a method and map it to the function declared in the SSDL. 次のクラスのメソッドは、EdmFunctionAttribute を使用して SSDL (上を参照) で定義される関数にマップされます。The method in the following class is mapped to the function defined in the SSDL (above) by using an EdmFunctionAttribute. このメソッドが呼び出されると、データベース内の対応する関数が実行されます。When this method is called, the corresponding function in the database is executed.

[EdmFunction("SchoolModel.Store", "AvgStudentGrade")]
public static decimal? AvgStudentGrade(int studentId)
{
    throw new NotSupportedException("Direct calls are not supported.");
}
<EdmFunction("SchoolModel.Store", "AvgStudentGrade")>
Public Function AvgStudentGrade(ByVal studentId As Integer) _
    As Nullable(Of Decimal)
    Throw New NotSupportedException("Direct calls are not supported.")
End Function

Example

最後に、メソッドを LINQ to Entities クエリで呼び出します。Finally, call the method in a LINQ to Entities query. 次のコードは、学生の姓と平均の成績をコンソールに表示します。The following code displays students' last names and average grades to the console:

using (SchoolEntities context = new SchoolEntities())
{
    var students = from s in context.People
                   where s.EnrollmentDate != null
                   select new
                   {
                       name = s.LastName,
                       avgGrade = AvgStudentGrade(s.PersonID)
                   };

    foreach (var student in students)
    {
        Console.WriteLine("{0}: {1}", student.name, student.avgGrade);
    }
}
Using context As New SchoolEntities()
    Dim students = From s In context.People _
        Where s.EnrollmentDate IsNot Nothing _
        Select New With {.name = s.LastName, _
                        .avgGrade = AvgStudentGrade(s.PersonID)}

    For Each student In students
        Console.WriteLine("{0}: {1}", _
                            student.name, _
                            student.avgGrade)
    Next
End Using

関連項目See also