【问题标题】:Sql Query to Linq using joins使用连接的 Sql 查询到 Linq
【发布时间】:2013-09-13 06:32:26
【问题描述】:

实际上,我正在尝试将我的 SQL 查询转换为 Linq。 我的查询包含 3 个表:

我的查询:

select ST.TEMPLATE_ID,ST.TEMPLATE_NAME,ST.CREATED_DATE
,count(distinct SQ.QUESTION_ID) as NOQ
,(
select count(*) from SURVEY_EMAIL_BLAST SEB 
where SEB.TEMPLATE_ID=ST.TEMPLATE_ID
and SEB.STATUS='Delivered'
) as [Sent]
,(
select count(*) from SURVEY_EMAIL_BLAST SEB 
where SEB.TEMPLATE_ID=ST.TEMPLATE_ID
and (SEB.EMAIL_RESULT_TEXT='Viewed' or seb.EMAIL_RESULT_TEXT='Completed')
) as [View]
,(
select count(*) from SURVEY_EMAIL_BLAST SEB 
where SEB.TEMPLATE_ID=ST.TEMPLATE_ID
and SEB.EMAIL_RESULT_TEXT='Completed'
) as [Reply]
from SURVEY_TEMPLATE ST left outer join SURVEY_QUESTION  SQ
on ST.TEMPLATE_ID=SQ.TEMPLATE_ID
group by ST.TEMPLATE_ID,ST.TEMPLATE_NAME,ST.CREATED_DATE
order by ST.TEMPLATE_ID

我的结果是:

我的 linq 查询是这样的:

var data111 = (from st in VDC.SURVEY_TEMPLATE
               join sq in VDC.SURVEY_QUESTION on new { TEMPLATE_ID = st.TEMPLATE_ID } equals new { TEMPLATE_ID = (Int64)sq.TEMPLATE_ID } into fg
               from z in fg.DefaultIfEmpty()
               group st by new
               {
                  st.TEMPLATE_ID,
                  st.TEMPLATE_NAME,
                  st.CREATED_DATE,                                           
               } into g
               orderby
               g.Key.TEMPLATE_ID
               select new
               {
                  TEMPLATE_ID = (Int64?)g.Key.TEMPLATE_ID,
                  g.Key.TEMPLATE_NAME,
                  CREATED_DATE = (DateTime?)g.Key.CREATED_DATE,
                  Sent = (Int64?)
                  (from seb in VDC.SURVEY_EMAIL_BLAST
                   where
                  seb.SURVEY_TEMPLATE.TEMPLATE_ID == g.Key.TEMPLATE_ID &&
                    seb.STATUS == "Delivered"
                    select new
                    {
                      seb
                    }).Count(),
                  View = (Int64?)
                  (from seb in VDC.SURVEY_EMAIL_BLAST
                    where
                    seb.SURVEY_TEMPLATE.TEMPLATE_ID == g.Key.TEMPLATE_ID && (
                    seb.EMAIL_RESULT_TEXT == "Viewed" ||
                    seb.EMAIL_RESULT_TEXT == "Completed")
                    select new
                     {
                       seb
                     }).Count(),
                    Reply = (Int64?)
                     (from seb in VDC.SURVEY_EMAIL_BLAST
                       where
                       seb.SURVEY_TEMPLATE.TEMPLATE_ID == g.Key.TEMPLATE_ID &&
                       seb.EMAIL_RESULT_TEXT == "Completed"
                       select new
                        {
                          seb
                         }).Count()
                   }).ToList();

现在我的结果是:

我无法显示NOQ 列。 谁能帮我?


【问题讨论】:

    标签: c# asp.net .net linq linq-to-entities


    【解决方案1】:

    首先,将z添加到group by源中:

               group new { st , z } by new
               {
                  st.TEMPLATE_ID,
                  st.TEMPLATE_NAME,
                  st.CREATED_DATE,                                           
               } into g
    

    然后用它在select中得到NOQ

    NOQ = g.Select(x => x.z.QUESTION_ID).Distinct().Count()
    

    或者只是将st 替换为z,因为您以后不会在任何地方使用st

               group z by new
               {
                  st.TEMPLATE_ID,
                  st.TEMPLATE_NAME,
                  st.CREATED_DATE,                                           
               } into g
    

    但这也需要更改select

    NOQ = g.Select(x => x.QUESTION_ID).Distinct().Count()
    

    说实话:您的查询看起来很糟糕。你确定不能做得更好吗?

    【讨论】:

    • 当我通过 new 编写 group new { st,sq} 时:sq 没有进入智能感知,并且错误如无法将 lambda 表达式转换为类型“不等式比较器”
    • @RealSteel 好的,我错过了DefaultIfEmpty 部分。尝试使用z 而不是sq
    • 即使我也这么认为 :) 我需要更改我的查询 :)
    猜你喜欢
    • 2014-12-01
    • 2021-05-07
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    相关资源
    最近更新 更多