Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用GroupBy和Detail从Linq到SQL—有更好的方法吗?_C#_Sql_Linq - Fatal编程技术网

C# 使用GroupBy和Detail从Linq到SQL—有更好的方法吗?

C# 使用GroupBy和Detail从Linq到SQL—有更好的方法吗?,c#,sql,linq,C#,Sql,Linq,我有一些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 = Categor

我有一些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表中所有内容的列表,以及categorilylinks表中链接到它的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
    });

我想您应该使用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()
                   }
试试这个:

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

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

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

由于某种原因,我的成绩增加了一倍。我简单地除以2,结果似乎有效。谢谢你的帮助!这是由于groupjoin是外部联接而不是内部联接。请在另一个答案中尝试我的代码。我不确定为什么您会在结果中得到2倍的计数。正如Kirill所说,它是一个左外连接,但这只意味着结果包含零链接的类别。不过,该解决方案不返回类别计数以外的信息。它返回计数和类别中的所有数据。我们按category中的所有字段分组,并将其放入新的匿名类型变量中,该变量包含两个属性:Count(包含Count)和category(属于category类型)以及category行中的所有数据。