linq 两表查询,分组并显示数量的问题。leftjoin 和group by的使用

f346444180 2017-08-18 10:46:22
直接上问题:
表A:Questions 关键字段qus_id,sub_id
表B:Subject 关键字段sub_id,sub_name,sub_tp_id
问题描述
表A存储所有问题并和表B字段sid关联。表B存有所有科目。
想查出B表所有sub_tp_id(方法传过来的id)下的所有科目并显示每个科目下问题的数量。没有的话count为0.

var query = (from s in db.Subject
join q in db.Questions
on s.sub_ID equals q.sub_ID
into ww
from xx in ww.DefaultIfEmpty()
where (s.sub_tp_ID == sub_tpid && ww.Count() >= 0)
group new { xx.qus_ID, xx.sub_ID, s.Sub_name }
by new { s.Sub_name, xx.sub_ID } into zz
select new
{
id = zz.Key,
name = zz.Key.Sub_name,
count = (int)zz.Count(t => zz.Key.sub_ID > -1)
});

因部分原因我多结果马赛克了一下,请见谅

注意看where条件那有个ww.Count()>=0
如果不加的话,只会显示下图中第二个结果,
如果加的话,能查询初所有数据但是sub_id有部分是null.第一个结果集显示。

问:怎么显示出是第一个结果集里的所有数据并且sub_Id能查询到的?请指教
再问:最后一行select里的zz.key.sub_id> -1是什么意思。查看了下文档没有发现
本周刚开始接触linq,对这一块有点迷惑,请各位指点下。先谢谢了。


...全文
1724 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
f346444180 2017-08-18
  • 打赏
  • 举报
回复
引用 8 楼 xdashewan 的回复:
[quote=引用 7 楼 f346444180 的回复:] 如果用q.qus_ID的话因为已经into到ww并放入xx里面了,直接引用q的话回报错。(应该是这么理解的吧)
这和qus_ID有什么关系,你图为null不都是sub_id吧,我也没让你用过q,我让你用的是s.sub_ID[/quote] 试了下,效果是一样的。应该是引用
f346444180 2017-08-18
  • 打赏
  • 举报
回复
引用 8 楼 xdashewan 的回复:
[quote=引用 7 楼 f346444180 的回复:] 如果用q.qus_ID的话因为已经into到ww并放入xx里面了,直接引用q的话回报错。(应该是这么理解的吧)
这和qus_ID有什么关系,你图为null不都是sub_id吧,我也没让你用过q,我让你用的是s.sub_ID[/quote] 额,不好意思,我一开始看错你回复的字段了,忙晕了有点,实在不好意思。抱歉哈。我试下
xdashewan 2017-08-18
  • 打赏
  • 举报
回复
引用 7 楼 f346444180 的回复:
如果用q.qus_ID的话因为已经into到ww并放入xx里面了,直接引用q的话回报错。(应该是这么理解的吧)
这和qus_ID有什么关系,你图为null不都是sub_id吧,我也没让你用过q,我让你用的是s.sub_ID
f346444180 2017-08-18
  • 打赏
  • 举报
回复
引用 6 楼 xdashewan 的回复:
[quote=引用 5 楼 f346444180 的回复:] 不行啊,因为前面已经into了,在直接s的话会报错。无法将lambda类型转换
这没有道理啊,同行里你s.Sub_name不一样在使用吗[/quote] 刚才忘记说了,s是subject表。里面不包含qus_id, 如果用q.qus_ID的话因为已经into到ww并放入xx里面了,直接引用q的话回报错。(应该是这么理解的吧)
xdashewan 2017-08-18
  • 打赏
  • 举报
回复
引用 5 楼 f346444180 的回复:
不行啊,因为前面已经into了,在直接s的话会报错。无法将lambda类型转换
这没有道理啊,同行里你s.Sub_name不一样在使用吗
f346444180 2017-08-18
  • 打赏
  • 举报
回复
引用 2 楼 xdashewan 的回复:
我举得既然左联,那么直接取s.sub_ID,不用取xx.sub_ID
不行啊,因为前面已经into了,在直接s的话会报错。无法将lambda类型转换
f346444180 2017-08-18
  • 打赏
  • 举报
回复
补充一点。select new {}里面的id=zz.key是后期写的要看返回的内容。实际id 要返回sub_Id,在这里我忘记修改了说一下
f346444180 2017-08-18
  • 打赏
  • 举报
回复
不行啊,因为前面已经into了,在直接s的话会报错。无法将lambda类型转换
xdashewan 2017-08-18
  • 打赏
  • 举报
回复
我举得既然左联,那么直接取s.sub_ID,不用取xx.sub_ID
f346444180 2017-08-18
  • 打赏
  • 举报
回复
Mark一下,我也不知道为什么代码看起来多了那么多东西
f346444180 2017-08-18
  • 打赏
  • 举报
回复
现把改动后代码说一下

var query = (from s in db.Subject
                         join q in db.Questions
                         on s.sub_ID equals q.sub_ID
                         into ww
                         from xx in ww.DefaultIfEmpty()
                         where (s.sub_tp_ID == sub_tpid && ww.Count() >= 0)
                         group new { xx.qus_ID, s.sub_ID, s.Sub_name }
                         by new { s.Sub_name, xx.sub_ID,subID=s.sub_ID } into zz
                         select new
                         {
                             subID=zz.Key.subID,
                             name = zz.Key.Sub_name,
                             count = (int)zz.Count(t => zz.Key.sub_ID > -1)
                         });
首先感谢下@xdashewan 给的提示。从中找到突破口 改动的位置在by 这一块制定规则里,再加一个subID=s.sub_ID,注意xx.sub_ID不能删掉。(删掉后得出的结果集会有问题,具体为什么我也是刚开始接触linq没几天还没研究透彻,抱歉) select new 里面的subID引用新加的subID. --------------------------------------- 关键点:1、首先关联查询两张表的数据放入一个临时表中(注意要左联。linq的DefaultIfEmpty()实现) 2、在分组规则里对加上要查询的表id,在临时表内取。在新定义个K赋值原表的id(这块不明白,知道的朋友可以留言告知。不胜感激)
qq_35997405 2017-08-18
  • 打赏
  • 举报
回复
mark mark
f346444180 2017-08-18
  • 打赏
  • 举报
回复
引用 2 楼 xdashewan 的回复:
我举得既然左联,那么直接取s.sub_ID,不用取xx.sub_ID
解决了问题。 某些地方做了改动。测试了下取数据没问题。

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧