Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
.net 在包含Count的子查询上具有左连接的Linq_.net_Linq_Count_Subquery_Left Join - Fatal编程技术网

.net 在包含Count的子查询上具有左连接的Linq

.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)

我很难将sql转换为linq语法

我有两个表(Category和CategoryList),它们使用CategoryID相互引用。我需要获得Category表中所有CategoryID的列表,以及CategoryList表中所有对应匹配项的CategoryID计数。如果CategoryID不存在于CategoryList中,则仍应返回CategoryID,但返回频率为0

以下sql查询演示了预期结果:

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:您能提供一个使用对象的关系能力的示例吗?