2013-09-13 4 views
0

На самом деле я пытаюсь преобразовать свой SQL запрос в Linq. Мой запрос содержит 3 таблицы:Sql Query to Linq с помощью объединений

Мой запрос:

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 

и мой результат:

enter image description here

и мой 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(); 

и теперь мой результат:

enter image description here

Я Невозможно отобразить NOQ столбец. Может ли кто-нибудь мне помочь?


ответ

1

Прежде всего, добавьте z в group by источник:

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

И затем использовать его, чтобы получить NOQ в select:

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

И если честно: ваш запрос выглядит ужасно. Вы уверены, что то же самое нельзя сделать лучше?

+0

когда я пишу группы нового {й, кв} новые: кв не приходит в IntelliSense, и ошибка, как не может преобразовать лямбда-выражение к типу «неравенству компаратора» – RealSteel

+0

@RealSteel КИ, я пропустил 'DefaultIfEmpty' часть. Попробуйте использовать 'z' вместо' sq'. – MarcinJuraszek

+0

даже я думаю то же самое :) Мне нужно изменить мой запрос :) – RealSteel

Смежные вопросы