方法: クエリを使用してモデル定義関数を呼び出す

このトピックでは、概念モデルで定義されている関数を LINQ to Entities クエリから呼び出す方法について説明します。

以下に示す手順は、モデル定義関数を LINQ to Entities クエリから呼び出す方法をまとめたものです。 各手順の詳しい説明は、その後の例で示します。 この手順では、関数を概念モデルで定義済みであると想定します。 詳細については、概念モデルでカスタム関数を定義する」を参照してください。

概念モデルで定義された関数を呼び出すには

  1. 概念モデルで定義された関数にマップされているアプリケーションに、共通言語ランタイム (CLR) メソッドを追加します。 メソッドをマップするには、ユーザーが EdmFunctionAttribute をメソッドに適用する必要があります。 属性の NamespaceName パラメーターと FunctionName パラメーターが、それぞれ概念モデルの名前空間名と関数名であることに注意してください。 LINQ の関数名解決では、大文字と小文字が区別されます。

  2. LINQ to Entities クエリから関数を呼び出します。

例 1

次の例は、概念モデルで定義されている関数を LINQ to Entities クエリから呼び出す方法を示しています。 この例では、School モデルを使用します。 School モデルの詳細については、「School サンプル データベースの作成」と「School .edmx ファイルの生成」を参照してください。

次の概念モデル関数は、あるインストラクターが雇用されてから経過した年数を返します。 関数を概念モデルに追加する方法については、「方法:概念モデルでカスタム関数を定義する」を参照してください。

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

例 2

次に、次のメソッドをアプリケーションに追加し、EdmFunctionAttribute を使用して概念モデル関数にマップします。

[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

例 3

これで、LINQ to Entities クエリから概念モデル関数を呼び出すことができます。 次のコードは、雇用年数が 10 年を超えるすべてのインストラクターを表示するメソッドを呼び出します。

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

関連項目