方法: クエリを使用してモデル定義関数を呼び出すHow to: Call Model-Defined Functions in Queries

このトピックでは、LINQ to Entities クエリ内から、概念モデルで定義されている関数を呼び出す方法について説明します。This topic describes how to call functions that are defined in the conceptual model from within LINQ to Entities queries.

次の手順では、LINQ to Entities クエリ内からモデル定義関数を呼び出す方法の概要について説明します。The procedure below provides a high-level outline for calling a model-defined function from within a LINQ to Entities query. 各手順の詳しい説明は、その後の例で示します。The example that follows provides more detail about the steps in the procedure. この手順では、関数を概念モデルで定義済みであると想定します。The procedure assumes that you have defined a function in the conceptual model. 詳細については、「方法 :概念モデルでカスタム関数を定義します。For more information, see How to: Define Custom Functions in the Conceptual Model.

概念モデルで定義された関数を呼び出すにはTo call a function defined in the conceptual model

  1. 概念モデルで定義された関数にマップされているアプリケーションに、共通言語ランタイム (CLR) メソッドを追加します。Add a common language runtime (CLR) method to your application that maps to the function defined in the conceptual model. メソッドをマップするには、ユーザーが EdmFunctionAttribute をメソッドに適用する必要があります。To map the method, you must apply an EdmFunctionAttribute to the method. 属性の NamespaceName パラメーターと FunctionName パラメーターが、それぞれ概念モデルの名前空間名と関数名であることに注意してください。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.

  2. LINQ to Entities クエリから関数を呼び出します。Call the function in a LINQ to Entities query.

Example

次の例は、概念モデルで定義されている関数を LINQ to Entities クエリ内から呼び出す方法を示しています。The following example demonstrates how to call a function that is defined in the conceptual model 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.

次の概念モデル関数は、あるインストラクターが雇用されてから経過した年数を返します。The following conceptual model function returns the number of years since an instructor was hired. 関数を概念モデルに追加する方法については、「方法:概念モデルでカスタム関数を定義します。)For information about adding the function to a conceptual model, see How to: Define Custom Functions in the Conceptual Model.)

<Function Name="YearsSince" ReturnType="Edm.Int32">
  <Parameter Name="date" Type="Edm.DateTime" />
  <DefiningExpression>
    Year(CurrentDateTime()) - Year(date)
  </DefiningExpression>
</Function>

Example

次に、次のメソッドをアプリケーションに追加し、EdmFunctionAttribute を使用して概念モデル関数にマップします。Next, add the following method to your application and use an EdmFunctionAttribute to map it to the conceptual model function:

[EdmFunction("SchoolModel", "YearsSince")]
public static int YearsSince(DateTime date)
{
    throw new NotSupportedException("Direct calls are not supported.");
}
<EdmFunction("SchoolModel", "YearsSince")>
Public Function YearsSince(ByVal date1 As DateTime) _
    As Integer
    Throw New NotSupportedException("Direct calls are not supported.")
End Function

Example

これで、LINQ to Entities クエリ内から概念モデル関数を呼び出すことができるようになりました。Now you can call the conceptual model function from within a LINQ to Entities query. 次のコードは、雇用年数が 10 年を超えるすべてのインストラクターを表示するメソッドを呼び出します。The following code calls the method to display all instructors that were hired more than ten years ago:

using (SchoolEntities context = new SchoolEntities())
{
    // Retrieve instructors hired more than 10 years ago.
    var instructors = from p in context.People
                      where YearsSince((DateTime)p.HireDate) > 10
                      select p;

    foreach (var instructor in instructors)
    {
        Console.WriteLine(instructor.LastName);
    }
}
Using context As New SchoolEntities()
    ' Retrieve instructors hired more than 10 years ago.
    Dim instructors = From p In context.People _
        Where YearsSince(CType(p.HireDate, DateTime?)) > 10 _
        Select p

    For Each instructor In instructors
        Console.WriteLine(instructor.LastName)
    Next
End Using

関連項目See also