如何:在查詢中呼叫模型定義函式
本主題描述如何從 LINQ to Entities 查詢內呼叫概念模型中所定義的函式。
以下程序提供從 LINQ to Entities 查詢內呼叫模型定義函式的高階概述。 程序後的範例提供程序中之步驟相關詳細資訊。 程序假設您已在概念模型中定義函式。 如需詳細資訊,請參閱作法:在概念模型中定義自訂函式。
呼叫概念模型中定義的函式
將 Common Language Runtime (CLR) 方法加入至您的應用程式,該方法會對應至概念模型中所定義之函式。 若要對應方法,您必須將 EdmFunctionAttribute 套用至方法。 請注意,屬性的 NamespaceName 和 FunctionName 參數分別是概念模型的命名空間名稱和概念模型中的函式名稱。 LINQ 的函式名稱解析是區分大小寫的。
呼叫 LINQ to Entities 查詢中的函式。
範例 1
下列範例示範如何從 LINQ to Entities 查詢內呼叫概念模型中所定義的函式。 範例使用 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 查詢內呼叫概念模型函式。 下列程式碼會呼叫該方法,顯示受雇超過十年的所有講師:
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