Nasıl yapılır: Sorgularda model tanımlı işlevleri çağırma

Bu konu başlığında, LINQ içindeki kavramsal modelde tanımlanan işlevlerin Varlıklar sorgularına nasıl çağrıldığı açıklanmaktadır.

Aşağıdaki yordam, LINQ to Entities sorgusu içinden model tanımlı bir işlevi çağırmak için üst düzey bir ana hat sağlar. Aşağıdaki örnek, yordamdaki adımlar hakkında daha fazla ayrıntı sağlar. yordam, kavramsal modelde bir işlev tanımladığınız varsayılır. Daha fazla bilgi için bkz . Nasıl yapılır: Kavramsal Modelde Özel İşlevleri Tanımlama.

Kavramsal modelde tanımlanan bir işlevi çağırmak için

  1. Uygulamanıza kavramsal modelde tanımlanan işlevle eşleyen bir ortak dil çalışma zamanı (CLR) yöntemi ekleyin. yöntemini eşlemek için yöntemine bir EdmFunctionAttribute uygulamanız gerekir. özniteliğinin NamespaceName ve FunctionName parametrelerinin kavramsal modelin ad alanı adı ve kavramsal modeldeki işlev adı olduğunu unutmayın. LINQ için işlev adı çözümlemesi büyük/küçük harfe duyarlıdır.

  2. LINQ to Entities sorgusundaki işlevi çağırın.

Örnek 1

Aşağıdaki örnekte, LINQ to Entities sorgusu içinden kavramsal modelde tanımlanan bir işlevin nasıl çağrıldığı gösterilmektedir. Örnekte School modeli kullanılır. Okul modeli hakkında bilgi için bkz . Okul Örnek Veritabanını Oluşturma ve School .edmx Dosyasını Oluşturma.

Aşağıdaki kavramsal model işlevi, eğitmenin işe alınmadan sonraki yıl sayısını döndürür. İşlevi kavramsal modele ekleme hakkında bilgi için bkz . Nasıl yapılır: Kavramsal Modelde Özel İşlevleri Tanımlama.

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

Örnek 2

Ardından, aşağıdaki yöntemi uygulamanıza ekleyin ve kavramsal model işleviyle eşlemek için bir EdmFunctionAttribute kullanın:

[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

Örnek 3

Artık linq to entities sorgusunun içinden kavramsal model işlevini çağırabilirsiniz. Aşağıdaki kod, on yıldan daha önce işe alınan tüm eğitmenleri görüntülemek için yöntemini çağırır:

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

Ayrıca bkz.