如何:在查询中调用模型定义函数 (LINQ to Entities)

本主题介绍如何在 LINQ to Entities 查询中调用在概念模型中定义的函数。

下面的过程高度概括了有关在 LINQ to Entities 查询中调用模型定义函数的信息。 后面的示例提供了有关该过程中各个步骤的更多详细信息。 这些过程假定您在概念模型中定义了一个函数。 有关更多信息,请参见How to: Define Custom Functions in the Conceptual Model

调用在概念模型中定义的函数

  1. 向应用程序中添加一个公共语言运行时 (CLR) 方法,该方法将映射到概念模型中定义的函数。 若要映射方法,必须将 EdmFunctionAttribute 应用于此方法。 请注意,此特性的 NamespaceNameFunctionName 参数分别是概念模型的命名空间名称和概念模型中的函数名称。 LINQ 的函数名称解析区分大小写。

  2. 在 LINQ to Entities 查询中调用该函数。

示例

下面的示例演示如何在 LINQ to Entities 查询中调用概念模型中定义的函数。 本示例使用 School 模型。 有关 School 模型的信息,请参见创建 School 示例数据库(实体框架快速入门)生成 School .edmx 文件(实体框架快速入门)

以下概念模型函数返回教师已聘用的年数。 有关向概念模型添加函数的信息,请参见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 查询中调用概念模型函数了。 下面的代码调用该方法以显示十年前雇佣的所有教师:

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