Share via


Nasıl Yapılır: Model Tanımlı İşlevleri Nesne Yöntemleri Olarak Çağırma

Bu konuda, model tanımlı bir işlevin bir nesnede ObjectContext yöntem olarak veya özel sınıfta statik bir yöntem olarak nasıl çağrıldığı açıklanmaktadır. Model tanımlı işlev, kavramsal modelde tanımlanan bir işlevdir. Konudaki yordamlarda, LINQ'ten Varlıklar sorgularına çağırmak yerine bu işlevlerin doğrudan nasıl çağrıldığı açıklanmaktadır. LINQ to Entities sorgularında model tanımlı işlevleri çağırma hakkında bilgi için bkz . Nasıl yapılır: Sorgularda Model Tanımlı İşlevleri Çağırma.

Model tanımlı bir işlevi bir ObjectContext yöntem olarak veya özel bir sınıfta statik bir yöntem olarak çağırdığınızda, önce yöntemini ile EdmFunctionAttributemodel tanımlı işleve eşlemeniz gerekir. Ancak, sınıfında bir yöntem ObjectContext tanımladığınızda, LINQ sağlayıcısını QueryProvider kullanıma açmak için özelliğini kullanmanız gerekirken, özel bir sınıfta statik bir yöntem tanımladığınızda, LINQ sağlayıcısını Provider kullanıma açmak için özelliğini kullanmanız gerekir. Daha fazla bilgi için aşağıdaki yordamları izleyen örneklere bakın.

Aşağıdaki yordamlar, model tanımlı bir işlevi bir nesnede ObjectContext bir yöntem olarak ve özel bir sınıfta statik bir yöntem olarak çağırmaya yönelik üst düzey ana hatlar sağlar. Aşağıdaki örnekler, yordamlardaki adımlar hakkında daha fazla ayrıntı sağlar. Yordamlar, 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.

Model tanımlı bir işlevi ObjectContext nesnesinde yöntem olarak çağırmak için

  1. Entity Framework araçları tarafından otomatik olarak oluşturulan sınıfından ObjectContext türetilen kısmi sınıfı genişletmek için bir kaynak dosyası ekleyin. Ayrı bir kaynak dosyada CLR saplamanın tanımlanması, dosya yeniden oluşturulduğunda değişikliklerin kaybolmasını engeller.

  2. Sınıfınıza ObjectContext aşağıdakileri yapabilen bir ortak dil çalışma zamanı (CLR) yöntemi ekleyin:

    • Kavramsal modelde tanımlanan işleve Haritalar. 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.

    • özelliği tarafından döndürülen yöntemin QueryProvider sonuçlarını Execute döndürür.

  3. yöntemini sınıfın bir örneğinde üye olarak çağırın ObjectContext .

Model tanımlı bir işlevi özel bir sınıfta statik yöntem olarak çağırmak için

  1. Aşağıdakileri yapabilen statik bir yöntemle uygulamanıza bir sınıf ekleyin:

    • Kavramsal modelde tanımlanan işleve Haritalar. 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.

    • Bağımsız IQueryable değişkeni kabul eder.

    • özelliği tarafından döndürülen yöntemin Provider sonuçlarını Execute döndürür.

  2. yöntemini üye olarak özel sınıfta statik bir yöntem olarak çağırın

Örnek 1

ObjectContext Nesnesinde Model Tanımlı İşlevi Yöntem Olarak Çağırma

Aşağıdaki örnekte, model tanımlı bir işlevin bir nesne üzerinde ObjectContext yöntem olarak nasıl çağrıldığı gösterilmektedir. Örnekte AdventureWorks Satış Modeli kullanılmaktadır.

Belirtilen bir ürünün ürün gelirini döndüren aşağıdaki kavramsal model işlevini göz önünde bulundurun. (İşlevi kavramsal modelinize ekleme hakkında bilgi için bkz. Nasıl yapılır: Kavramsal Modelde Özel İşlevleri Tanımlama.)

<Function Name="GetProductRevenue" ReturnType="Edm.Decimal">
  <Parameter Name="productID" Type="Edm.Int32" />
  <DefiningExpression>
    SUM( SELECT VALUE((s.UnitPrice - s.UnitPriceDiscount)  * s.OrderQty)
    FROM AdventureWorksEntities.SalesOrderDetails as s
    WHERE s.ProductID = productID)
  </DefiningExpression>
</Function>

Örnek 2

Aşağıdaki kod, yukarıdaki kavramsal model işlevine eşleyen sınıfına bir yöntem AdventureWorksEntities ekler.

public partial class AdventureWorksEntities : ObjectContext
{
    [EdmFunction("AdventureWorksModel", "GetProductRevenue")]
    public decimal? GetProductRevenue(int productId)
    {
        return this.QueryProvider.Execute<decimal?>(Expression.Call(
            Expression.Constant(this),
            (MethodInfo)MethodInfo.GetCurrentMethod(),
            Expression.Constant(productId, typeof(int))));
    }
}
Partial Public Class AdventureWorksEntities
    Inherits ObjectContext

    <EdmFunction("AdventureWorksModel", "GetProductRevenue")>
    Public Function GetProductRevenue(ByVal details As _
                    IQueryable(Of SalesOrderDetail)) As _
                    System.Nullable(Of Decimal)
        Return Me.QueryProvider.Execute(Of System.Nullable(Of Decimal)) _
            (Expression.[Call](Expression.Constant(Me), _
            DirectCast(MethodInfo.GetCurrentMethod(), MethodInfo), _
            Expression.Constant(details, GetType(IQueryable(Of SalesOrderDetail)))))
    End Function
End Class

Örnek 3

Aşağıdaki kod, belirtilen bir ürünün ürün gelirini görüntülemek için yukarıdaki yöntemi çağırır:

using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    int productId = 776;

    Console.WriteLine(AWEntities.GetProductRevenue(productId));
}
Using AWEntities As New AdventureWorksEntities()

    Dim productId As Integer = 776

    Dim details = From s In AWEntities.SalesOrderDetails _
                  Where s.ProductID = productId _
                  Select s

    Console.WriteLine(AWEntities.GetProductRevenue(details))
End Using

Örnek 4

Aşağıdaki örnekte, koleksiyon döndüren model tanımlı bir işlevin nasıl çağrıldığı gösterilmektedir (nesne olarak IQueryable<T> ). Belirli bir ürün kimliğinin tümünü SalesOrderDetails döndüren aşağıdaki kavramsal model işlevini göz önünde bulundurun.

<Function Name="GetDetailsById" 
          ReturnType="Collection(AdventureWorksModel.SalesOrderDetail)">
  <Parameter Name="productID" Type="Edm.Int32" />
  <DefiningExpression>
    SELECT VALUE s
    FROM AdventureWorksEntities.SalesOrderDetails AS s
    WHERE s.ProductID = productID
  </DefiningExpression>
</Function>

Örnek 5

Aşağıdaki kod, yukarıdaki kavramsal model işlevine eşleyen sınıfına bir yöntem AdventureWorksEntities ekler.

public partial class AdventureWorksEntities : ObjectContext
{
    [EdmFunction("AdventureWorksModel", "GetDetailsById")]
    public IQueryable<SalesOrderDetail> GetDetailsById(int productId)
    {
        return this.QueryProvider.CreateQuery<SalesOrderDetail>(Expression.Call(
            Expression.Constant(this),
            (MethodInfo)MethodInfo.GetCurrentMethod(),
            Expression.Constant(productId, typeof(int))));
    }
}
Partial Public Class AdventureWorksEntities
    Inherits ObjectContext
    <EdmFunction("AdventureWorksModel", "GetDetailsById")> _
    Public Function GetDetailsById(ByVal productId As Integer) _
            As IQueryable(Of SalesOrderDetail)
        Return Me.QueryProvider.CreateQuery(Of SalesOrderDetail) _
            (Expression.[Call](Expression.Constant(Me), _
             DirectCast(MethodInfo.GetCurrentMethod(), MethodInfo), _
             Expression.Constant(productId, GetType(Integer))))
    End Function
End Class

Örnek 6

Aşağıdaki kod yöntemini çağırır. Döndürülen IQueryable<T> sorgunun her SalesOrderDetailbiri için satır toplamlarını döndürecek şekilde daha da iyileştirilmiş olduğunu unutmayın.

using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    int productId = 776;

    var lineTotals = AWEntities.GetDetailsById(productId).Select(d =>d.LineTotal);

    foreach(var lineTotal in lineTotals)
    {
        Console.WriteLine(lineTotal);
    }
}
Using AWEntities As New AdventureWorksEntities()
    Dim productId As Integer = 776

    Dim lineTotals = AWEntities.GetDetailsById(productId).[Select](Function(d) d.LineTotal)

    For Each lineTotal In lineTotals
        Console.WriteLine(lineTotal)
    Next

Örnek 7

Model Tanımlı İşlevi Özel Bir Sınıfta Statik Yöntem Olarak Çağırma

Sonraki örnekte, model tanımlı bir işlevin özel bir sınıfta statik yöntem olarak nasıl çağrıldığı gösterilmektedir. Örnekte AdventureWorks Satış Modeli kullanılmaktadır.

Not

Model tanımlı bir işlevi özel bir sınıfta statik bir yöntem olarak çağırdığınızda, model tanımlı işlevin bir koleksiyonu kabul etmesi ve koleksiyondaki değerlerin bir toplamasını döndürmesi gerekir.

Aşağıdaki SalesOrderDetail koleksiyonu için ürün geliri döndüren kavramsal model işlevini göz önünde bulundurun. (İşlevi kavramsal modelinize ekleme hakkında bilgi için bkz. Nasıl yapılır: Kavramsal Modelde Özel İşlevleri Tanımlama.)

<Function Name="GetProductRevenue" ReturnType="Edm.Decimal">
  <Parameter Name="details" Type="Collection(AdventureWorksModel.SalesOrderDetail)" />
  <DefiningExpression>
    SUM( SELECT VALUE((s.UnitPrice - s.UnitPriceDiscount)  * s.OrderQty)
    FROM details as s)
  </DefiningExpression>
</Function>

Örnek 8

Aşağıdaki kod, uygulamanıza yukarıdaki kavramsal model işleviyle eşleyen statik bir yöntem içeren bir sınıf ekler.

public class MyClass
{
    [EdmFunction("AdventureWorksModel", "GetProductRevenue")]
    public static decimal? GetProductRevenue(IQueryable<SalesOrderDetail> details)
    {
        return details.Provider.Execute<decimal?>(Expression.Call(
            (MethodInfo)MethodInfo.GetCurrentMethod(),
            Expression.Constant(details, typeof(IQueryable<SalesOrderDetail>))));
    }
}
Public Class [MyClass]
    <EdmFunction("AdventureWorksModel", "GetProductRevenue")> _
    Public Shared Function GetProductRevenue(ByVal details As _
                IQueryable(Of SalesOrderDetail)) As _
                System.Nullable(Of Decimal)
        Return details.Provider.Execute(Of System.Nullable(Of Decimal)) _
            (Expression.[Call](DirectCast(MethodInfo.GetCurrentMethod(), MethodInfo), _
            Expression.Constant(details, GetType(IQueryable(Of SalesOrderDetail)))))
    End Function
End Class

Örnek 9

Aşağıdaki kod, SalesOrderDetail koleksiyonunun ürün gelirini görüntülemek için yukarıdaki yöntemi çağırır:

using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    int productId = 776;

    var details = from s in AWEntities.SalesOrderDetails
                  where s.ProductID == productId select s;

    Console.WriteLine(MyClass.GetProductRevenue(details));
}
Using AWEntities As New AdventureWorksEntities()
    Dim productId As Integer = 776

    Dim details = From s In AWEntities.SalesOrderDetails _
                  Where s.ProductID = productId _
                  Select s

    Console.WriteLine([MyClass].GetProductRevenue(details))
End Using

Ayrıca bkz.