Megosztás a következőn keresztül:


Útmutató: Modell által definiált függvények meghívása objektummetódusként

Ez a témakör azt ismerteti, hogyan hívhat meg egy modell által definiált függvényt metódusként egy ObjectContext objektumon vagy statikus metódusként egy egyéni osztályon. A modell által definiált függvények a fogalmi modellben definiált függvények. A témakör eljárásai azt írják le, hogyan hívhatja meg ezeket a függvényeket közvetlenül a LINQ-ból az Entitások lekérdezésekbe való meghívás helyett. A modell által definiált függvények linq-beli meghívásáról az Entitások lekérdezések között a következő témakörben olvashat bővebben: Modellalapú függvények meghívása lekérdezésekben.

Akár metódusként, akár statikus metódusként ObjectContext hív meg egy modell által definiált függvényt egy egyéni osztályban, először le kell képeznie a metódust a modell által definiált függvényhez egy EdmFunctionAttribute. Amikor azonban egy metódust határoz meg az ObjectContext osztályon, a QueryProvider tulajdonság használatával kell elérhetővé tennie a LINQ-szolgáltatót, míg ha statikus metódust határoz meg egy egyéni osztályon, a Provider tulajdonság használatával elérhetővé kell tennie a LINQ-szolgáltatót. További információkért tekintse meg az alábbi eljárásokat követő példákat.

Az alábbi eljárások magas szintű vázlatokat nyújtanak a modell által definiált függvények metódusként való meghívásához egy ObjectContext objektumon, és statikus metódusként egy egyéni osztályon. Az alábbi példák részletesebben ismertetik az eljárások lépéseit. Az eljárások feltételezik, hogy definiált egy függvényt a fogalmi modellben. További információ : How to: Define Custom Functions in the Conceptual Model.

Modell által definiált függvény meghívása metódusként egy ObjectContext objektumon

  1. Adjon hozzá egy forrásfájlt az osztályból ObjectContext származó részleges osztály kiterjesztéséhez, amelyet az Entity Framework-eszközök automatikusan generálnak. A CLR-csonk külön forrásfájlban való definiálása megakadályozza a módosítások elvesztését a fájl újragenerálásakor.

  2. Adjon hozzá egy közös nyelvi futtatókörnyezeti (CLR) metódust az ObjectContext osztályhoz, amely a következőket teszi:

    • Térképek a fogalmi modellben definiált függvényre. A metódus leképezéséhez alkalmaznia kell egy EdmFunctionAttribute metódust. Vegye figyelembe, hogy az NamespaceName attribútum és FunctionName paraméterei a fogalmi modell névtérneve, a függvény neve pedig a fogalmi modellben. A LINQ függvénynévfeloldás megkülönbözteti a kis- és nagybetűk nevét.

    • A tulajdonság által QueryProvider visszaadott metódus eredményeit Execute adja vissza.

  3. Hívja meg a metódust tagként az ObjectContext osztály egy példányán.

Modell által definiált függvény meghívása statikus metódusként egy egyéni osztályban

  1. Adjon hozzá egy osztályt az alkalmazáshoz egy statikus módszerrel, amely a következőket teszi:

    • Térképek a fogalmi modellben definiált függvényre. A metódus leképezéséhez alkalmaznia kell egy EdmFunctionAttribute metódust. Vegye figyelembe, hogy az NamespaceName attribútum és FunctionName paraméterei a fogalmi modell névtérneve, a függvény neve pedig a fogalmi modellben.

    • Argumentumot IQueryable fogad el.

    • A tulajdonság által Provider visszaadott metódus eredményeit Execute adja vissza.

  2. A metódus tagként történő meghívása statikus metódusként az egyéni osztályban

1. példa

Modellalapú függvény meghívása metódusként egy ObjectContext objektumon

Az alábbi példa bemutatja, hogyan hívhat meg egy modell által definiált függvényt metódusként egy ObjectContext objektumon. A példa az AdventureWorks értékesítési modelljét használja.

Vegye figyelembe az alábbi fogalmi modellfüggvényt, amely egy adott termék termékbevételét adja vissza. (További információ a függvény koncepcionális modellhez való hozzáadásáról: Útmutató: Egyéni függvények definiálása a fogalmi modellben.)

<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>

2. példa

Az alábbi kód hozzáad egy metódust az AdventureWorksEntities osztályhoz, amely megfelel a fenti elméleti modellfüggvénynek.

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

3. példa

A következő kód meghívja a fenti metódust egy adott termék termékbevételének megjelenítéséhez:

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

4. példa

Az alábbi példa bemutatja, hogyan hívható meg egy modell által definiált függvény, amely gyűjteményt ad vissza (objektumként IQueryable<T> ). Vegye figyelembe az alábbi fogalmi modellfüggvényt, amely egy SalesOrderDetails adott termékazonosító összes értékét adja vissza.

<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>

5. példa

Az alábbi kód hozzáad egy metódust az AdventureWorksEntities osztályhoz, amely megfelel a fenti elméleti modellfüggvénynek.

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

6. példa

Az alábbi kód meghívja a metódust. Vegye figyelembe, hogy a visszaadott IQueryable<T> lekérdezés tovább finomul, hogy az egyes SalesOrderDetailsorok végösszegeit adja vissza.

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

7. példa

Modellalapú függvény meghívása statikus metódusként egyéni osztályon

A következő példa bemutatja, hogyan hívhat meg egy modell által definiált függvényt statikus metódusként egy egyéni osztályon. A példa az AdventureWorks értékesítési modelljét használja.

Feljegyzés

Amikor egy modell által definiált függvényt statikus metódusként hív meg egy egyéni osztályon, a modell által definiált függvénynek el kell fogadnia egy gyűjteményt, és vissza kell adnia a gyűjtemény értékeinek összesítését.

Vegye figyelembe az alábbi fogalmi modellfüggvényt, amely egy SalesOrderDetail-gyűjtemény termékbevételét adja vissza. (További információ a függvény koncepcionális modellhez való hozzáadásáról: Útmutató: Egyéni függvények definiálása a fogalmi modellben.)

<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>

8. példa

Az alábbi kód hozzáad egy osztályt az alkalmazáshoz, amely egy statikus metódust tartalmaz, amely megfelel a fenti elméleti modellfüggvénynek.

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

9. példa

A következő kód meghívja a fenti metódust egy SalesOrderDetail-gyűjtemény termékbevételének megjelenítéséhez:

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

Lásd még