J'ai une requête que je tente de porter de SQL (T-SQL) vers LINQ-to-Entities 4.0 (C#). Le jeu de résultats contient une combinaison de "lignes de détail" standard et d'informations "statistiques" globales.Sélection de statistiques agrégées (groupées) avec des enregistrements dans une requête LINQ-to-Entities
SQL d'origine utilisé une norme gauche, sélectionnez-jointe à l'information globale, semblable à ceci:
SELECT
UserId,
Name,
Email,
ISNULL(Stats.TotalPosts, 0) as TotalPosts,
Stats.LastPost
FROM Users
LEFT OUTER JOIN
(
SELECT UserId, COUNT(*) as TotalPosts, MAX(DatePosted) as LastPost
FROM Articles
GROUP BY UserId
) as Stats ON Stats.UserId = Users.UserID
A gauche join est utilisé plutôt que les sous-requêtes dans l'instruction SELECT pour des raisons de performance - plus d'un agrégat statistique est renvoyée (nombre total de messages et date du dernier message)
J'ai rencontré un succès partiel en le convertissant en une requête LINQ vers Entités en C# 4.0, mais je ne suis pas entièrement sûr de savoir comment la jointure devrait faire un lien avec l'énoncé du groupe. J'imagine que je pense à cela en termes de SQL et ne pas utiliser correctement LINQ.
J'ai eu un certain succès les statistiques de rupture dans une requête distincte:
var stats =
(
from a in entities.Articles
group a by a.UserId into g
select new
{
UserId = g.Key,
TotalPosts = g.Count(),
LastUpdated = g.Max(i => i.DatePosted)
}
);
var query =
(
from u in entities.Users
join s in stats on u.UserId equals s.UserId
orderby u.Name
select new UserListing()
{
UserId = u.UserId,
Name = u.Name,
Email = u.Email,
TotalPosts = s.TotalPosts,
LastUpdated = s.LastUpdated
}
);
Malheureusement, la jointure des dans les filtres requête LINQ tous les utilisateurs qui ne sont pas soumis tous les articles. Passer à l'équivalent d'une jointure externe en incluant DefaultIfEmpty provoque d'autres problèmes - Je peux seulement retourner "null" pour TotalPosts au lieu de 0. Même avec "TotalPosts = (s.TotalPosts == null)? 0: s. TotalPosts "dans select, une exception est levée sauf si la propriété TotalPosts est nullable. Quelles sont les meilleures pratiques pour combiner des lignes de détail et des informations agrégées de cette manière?
Merci!
Je n'ai pas réussi à compiler. Mes connaissances LINQ ne sont pas très bonnes, mais GetValueOrDefault n'est pas une méthode d'extension de "int" ou "int?" – ShadowChaser