Entity Framework 4 INNER JOIN aide

entity entity-framework inner-join

Question

Quelqu'un peut-il me dire comment écrire la requête suivante dans Entity Framework 4.0? "Blogs" et "Catégories" sont mes entités. La requête me renvoie essentiellement la liste des catégories et le nombre de blogs appartenant à cette catégorie.

SELECT b.CategoryId, c.Value, Count(b.Id) AS [Count] FROM dbo.Blogs b
INNER JOIN dbo.Categories c ON b.CategoryId = c.Id
GROUP BY b.CategoryId, c.Value

Merci d'avance.

Réponse acceptée

Ce qui suit devrait fonctionner (LinqToEntities):

var categories = from c in oc.Categories
                 select new
                 {
                     CategoryId = c.Id,
                     c.Value,
                     Count = c.Blogs.Count()
                 }

Cela vous donnera une liste d'identifiants de catégorie et de valeurs et pour chaque identifiant de catégorie, vous obtenez le nombre de blogs dans cette catégorie.

EDIT: Pour répondre à la question dans votre commentaire: cela n’est pas possible dans LinqToEntities mais vous pouvez le faire dans Entity SQL.

var results = new ObjectQuery<DbDataRecord>(
    @"SELECT y, COUNT(y)
      FROM MyEntities.Blogs AS b
      GROUP BY YEAR(b.CreatedDate) AS y", entities).ToList();
var nrBlogsPerYear = from r in results
                     select new { Year = r[0], NrBlogs = r[1] };

Dans la requête Entity SQL, vous devez remplacer MyEntities par le nom de votre contexte.

EDIT: Comme je viens de le découvrir grâce à un commentaire de Craig, le regroupement par année est possible dans L2E afin que vous puissiez écrire votre requête de la manière suivante:

    var nrBlogsPerYear = from b in oc.Blogs
                         group b by b.CreatedDate.Year into g
                         select new { Year = g.Key, NrBlogs = g.Count() };

Réponse populaire

Si vous avez des propriétés de navigation dans vos entités, vous pouvez le faire:

var cats = from c in db.Categories
           let count = c.Blogs.Count()
           where count > 0
           select new
           {
               CategoryId = c.Id,
               Value = c.Value,
               Count = count
           };

Si vous préférez utiliser une jointure explicite, vous pouvez le faire comme ça:

var cats = from c in db.Categories
           join b in db.Blogs on c.Id equals b.CategoryId into g
           select new
           {
               CategoryId = c.Id,
               Value = c.Value,
               Count = g.Count()
           };


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow