Entity Framework 4 INNER JOIN помощь - PullRequest
       12

Entity Framework 4 INNER JOIN помощь

2 голосов
/ 14 августа 2010

Может кто-нибудь сказать мне, как написать следующий запрос в Entity Framework 4.0? «Блоги» и «Категории» являются моими сущностями. Запрос в основном возвращает мне список категорий и количество блогов в этой категории.

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

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 14 августа 2010

Должно работать следующее (LinqToEntities):

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

Это даст вам список идентификаторов и значений категорий, и для каждого идентификатора категории вы получите количество блогов в этой категории.

РЕДАКТИРОВАТЬ: Чтобы дать ответ на вопрос в вашем комментарии: это невозможно в LinqToEntities, но вы можете сделать это в 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] };

В запросе Entity SQL вы должны заменить MyEntities именем вашего контекста.

РЕДАКТИРОВАТЬ: Как я только что узнал из комментария Крейга, группировка по годам это возможно в L2E, поэтому вы можете написать свой запрос следующим образом:

    var nrBlogsPerYear = from b in oc.Blogs
                         group b by b.CreatedDate.Year into g
                         select new { Year = g.Key, NrBlogs = g.Count() };
2 голосов
/ 14 августа 2010

Если у вас есть свойства навигации в ваших сущностях, вы можете сделать это:

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
           };

Если вы предпочитаете использовать явное объединение, вы можете сделать это следующим образом:

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()
           };
1 голос
/ 24 июля 2012
var query = from p in B.Products
            join c in B.Categories  on p.CategoryID equals c.CategoryID 
            orderby c.CategoryName,p.ProductName 
            select new 
            {
                c.CategoryName ,
                p.ProductName,
                p.ReorderLevel  
            };

GridView1.DataSource = query.ToList();
GridView1.DataBind();
...