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 :