1

我有一些 SQL,并试图在 LINQ 中实现等价。这是 SQL:

SELECT Categories.CategoryDescription, Categories.CategoryType AS Type, 
       Categories.Category, COUNT(CategoryLinks.OrgID) AS CountOfOrgs 
FROM CategoryLinks 
INNER JOIN Categories ON Categories.CategoryID = CategoryLinks.CategoryID 
GROUP BY Categories.Category, Categories.CategoryType, Categories.CategoryDescription 
ORDER BY CategoryDescription ASC

本质上,我想要一个来自 Categories 表的所有内容的列表以及链接到它的 CategoryLinks 表中 OrgId 的数量。

以下是我目前正在执行的查询。必须有一种更有效的方法来做到这一点。我错了吗?

var cnts = (from c in db.Categories
  join cl in db.CategoryLinks on c.CategoryID equals cl.CategoryID
  group new { c, cl } by new
  {
    c.CategoryID
  } into g
  select new
  {
    CategoryID = g.Key.CategoryID,
    categoryCount = g.Count()
  });

  var results = (from c in db.Categories
    join cn in cnts on c.CategoryID equals cn.CategoryID
    select new
    {
      c.CategoryID,
      c.CategoryDescription,
      c.CategoryType,
      Category = c.Category1,
      cn.categoryCount
    });
4

2 回答 2

2

我想你想使用 GroupJoin 方法:

Categories.GroupJoin(
    CategoryLinks, 
    x => x.CategoryID, 
    y => y.CategoryID, 
    (x,y) => new{
        x.CategoryID, 
        x.CategoryDescription, 
        x.CategoryType, 
        Category = x.Category1, 
        CategoryCount = y.Count() })

在查询语法中,这写为 join..into:

from c in db.Categories
    join cl in db.CategoryLinks on c.CategoryID equals cl.CategoryID into catGroup
    select new
                   {
                       c.CategoryID,
                       c.CategoryDescription,
                       c.CategoryType,
                       Category = c.Category1,
                       CategoryCount = catGroup.Count()
                   }
于 2012-11-26T21:05:49.957 回答
0

尝试这个:

var bbb = categories.Join(categoryLinks, c => c.CategoryID, cl => cl.CategoryId, (c, cl) => new {c, cl})
                    .GroupBy(g => g.c)
                    .Select(g => new {count = g.Count(), Category = g.Key});

它返回计数和类别中的所有数据。我们按类别中的所有列分组,并将结果放入新的匿名类型变量中,该变量包含 2 个属性:计数,包含计数和类别,类别类型为类别并包含类别行中的所有数据。如果需要,可以将其重写为:

var bbb = categories.Join(categoryLinks, c => c.CategoryID, cl => cl.CategoryId, (c, cl) => new {c, cl})
                    .GroupBy(g => g.c)
                    .Select(g => new
                                 {
                                    CategoryID = g.Key.CategoryId,
                                    CategoryDescription = g.Key.CategoryDescription,
                                    CategoryType = g.Key.CategoryType,
                                    Category = g.Key.Category1,
                                    categoryCount = g.Count()
                                 });
于 2012-11-26T21:21:53.447 回答