.net 在包含Count的子查询上具有左连接的Linq
我很难将sql转换为linq语法 我有两个表(Category和CategoryList),它们使用CategoryID相互引用。我需要获得Category表中所有CategoryID的列表,以及CategoryList表中所有对应匹配项的CategoryID计数。如果CategoryID不存在于CategoryList中,则仍应返回CategoryID,但返回频率为0 以下sql查询演示了预期结果:.net 在包含Count的子查询上具有左连接的Linq,.net,linq,count,subquery,left-join,.net,Linq,Count,Subquery,Left Join,我很难将sql转换为linq语法 我有两个表(Category和CategoryList),它们使用CategoryID相互引用。我需要获得Category表中所有CategoryID的列表,以及CategoryList表中所有对应匹配项的CategoryID计数。如果CategoryID不存在于CategoryList中,则仍应返回CategoryID,但返回频率为0 以下sql查询演示了预期结果: SELECT c.CategoryID, COALESCE(cl.frequency, 0)
SELECT c.CategoryID, COALESCE(cl.frequency, 0) as frequency
FROM Category c
LEFT JOIN (
SELECT cl.CategoryID, COUNT(cl.CategoryID) as frequency
FROM CategoryListing cl
GROUP BY cl.CategoryID
) as cl
ON c.CategoryID = cl.CategoryID
WHERE c.GuideID = 1
未测试,但这应该可以做到:
var q = from c in ctx.Category
join clg in
(
from cl in ctx.CategoryListing
group cl by cl.CategoryID into g
select new { CategoryID = g.Key, Frequency = g.Count()}
) on c.CategoryID equals clg.CategoryID into cclg
from v in cclg.DefaultIfEmpty()
where c.GuideID==1
select new { c.CategoryID, Frequency = v.Frequency ?? 0 };
我继续,将整个查询移动到数据库上的存储过程中。这首先通过避免LINQ解决了问题。Frans,感谢您的快速回复。这是伟大的作品,除了我需要一个左加入clg。哦!我的坏朋友,会治好它的。只要一秒钟就搞定了。它需要一个into子句和一个defaultifempty(这会导致一个groupjoin+defaultifempty调用,这是我最讨厌linq的两件事,因为它们让编写linq提供程序成为了一个真正的地狱;)@Neil Barnwell:您可以通过使用join和on equals在linq中进行左连接。对于内部联接,您应该使用对象的关系能力,而不是使用join关键字。@ACHDA99:您能提供一个使用对象的关系能力的示例吗?