次の方法で共有


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

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

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

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

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

  2. LINQ to Entities クエリを使用して関数を呼び出します。

次の例は、概念モデルで定義されている関数を LINQ to Entities クエリから呼び出す方法を示しています。 この例では、School モデルを使用します。 For information about the School model, see School サンプル データベースの作成 (Entity Framework クイック スタート) and School .edmx ファイルの生成 (Entity Framework クイック スタート).

次の概念モデル関数は、あるインストラクターが雇用されてから経過した年数を返します。 関数を概念モデルに追加する方法については、「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>

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

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

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

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
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);
    }
}

参照

処理手順

方法: モデル定義関数をオブジェクト メソッドとして呼び出す (LINQ to Entities)

概念

LINQ to Entities でのクエリ
LINQ to Entities クエリ内の関数の呼び出し

その他のリソース

.edmx File Overview