Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

CSDL Function

Dans mon post précédent, j’ai utilisé une CSDL Function afin de générer une requête SQL avec un DateDiff utilisant la date courante sur la BD à partir d’une requête LINQ.

Dans le cadre de ce post, vous avez probablement remarqué que dans le cadre de plusieurs requêtes, je souhaite calculer le montant d’un OrderDetail en calculant :

(double)od.Quantity * (double)od.UnitPrice * (1D - od.Discount)

Bien entendu, on peut rajouter une propriété à la classe OrderDetail mais le problème c’est que dans ce cas, on ne pourra pas utiliser cette propriété dans nos requêtes LINQ To Entities.

D’où l’idée d’utiliser une CSDL Function pour cela.

Commençons par rajouter la CSDL Function dans l’edmx:

<Function Name="GetAmount" ReturnType="Double">
  <Parameter Name="orderDetail" Type="Self.OrderDetail" />
  <DefiningExpression>
    CAST(orderDetail.Quantity AS Edm.Double) * CAST(orderDetail.UnitPrice AS Edm.Double) * (1 - orderDetail.Discount)
  </DefiningExpression>
</Function>

Ensuite rajoutons l’extension method:

public static class OrderDetailExtension
{
    [EdmFunction("MyNorthwindEFModel", "GetAmount")]
    public static double GetAmount(this OrderDetail orderDetail)
    {
        return (double)orderDetail.Quantity * (double)orderDetail.UnitPrice * (1D - orderDetail.Discount);
    }
}

Maintenant la requête suivante:

var q = from e in context.Employees
        let sold = e.Orders.Sum(o => o.OrderDetails.Sum(od => (double)od.Quantity * (double)od.UnitPrice * (1D - od.Discount)))
        orderby sold descending 
        select new { Employee = e, Sold = sold };

peut s’écrire comme ceci:

var q = from e in context.Employees
        let sold = e.Orders.Sum(o => o.OrderDetails.Sum(od => od.GetAmount()))
        orderby sold descending
        select new { Employee = e, Sold = sold };

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié dimanche 14 mars 2010 07:23 par Matthieu MEZIL

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [SharePoint] Les sessions TechDays 2012… par Le blog de Patrick [MVP SharePoint] le il y a 3 heures et 15 minutes

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le 02-09-2012, 11:01

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le 02-09-2012, 08:28

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59