ALT .NET Demo
Mercredi dernier, j'ai animé une session pour la communauté ALT .NET sur Entity Framework.
Lors de cette session, j'ai notamment fait une demo avec du WCF, de l'Entity Framework avec du POCO et un pseudo provider LINQ côté client. Ce provider est particulièrement simpliste (développé en seulement 15 mins), n'est pas thread safe mais a l'intéressante particularité de laisser LINQ To Object prendre le relais quand mon provider LINQ ne sait pas gérer.
J'aimerais revenir sur le fonctionnement de mon provider LINQ qui est un peu particulier et plus précisément sur ce code :
public static class CategoryClient
{
public static MyQueryable<Category> Categories
{
get
{
ClientLINQ.AllEntities = true;
return GetCategories().ToMyQueryable();
}
}
private static IEnumerable<Category> GetCategories()
{
List<Category> value;
if (ClientLINQ.AllEntities)
value = Context.Instance.CategoryContract.GetAllCategories();
else
value = Context.Instance.CategoryContract.GetCategories(ClientLINQ.IncludeValues, ClientLINQ.WhereValue, ClientLINQ.OrderByValue, ClientLINQ.SkipValue, ClientLINQ.TakeValue);
foreach (var category in value)
yield return category;
}
}
Comment ce code marche ? Comment alors que le set de AllEntities à true réinitialise les propriétés IncludeValues, WhereValues, etc
IncludeValues = null;
WhereValue = null;
OrderByValue = null;
SkipValue = 0;
TakeValue = 0;
Comment AllEntities pourrait-il être à faux dans la méthode GetCategories alors que l'instruction qui suit le AllEntities = true est l'appel à GetCategories et que cette méthode commence avec un test sur AllEntities ?
En fait, il faut remarquer que cette méthode utilise la syntaxe yield return. Du coup, elle ne sera exécutée que lorsque la propriété Categories sera itérée. Cela signifie donc que l'appel aux différentes méthodes de LINQ se fera préalablement.
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 :