C# 使用GroupBy和Detail从Linq到SQL—有更好的方法吗?
我有一些SQL,正在尝试在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
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行中的所有数据。