2016-01-21 61 views
0

這是SQL代碼產生正確的結果:翻譯複雜的T-SQL查詢LINQ到實體

select s.Code, s.Name, coalesce(ss.Url, a.Url), a.SocialMediaTypeKey 
from School s 
Left join 
(
SELECT dbo.SchoolSocialMedia.SocialMediaTypeKey 
, SchoolSocialMedia.Url 
, dbo.Department.Name 
, dbo.Department.ImportBusinessKey 
FROM dbo.SchoolSocialMedia 
    INNER JOIN dbo.Department ON dbo.SchoolSocialMedia.DepartmentId = dbo.Department.Id 
) A 
ON 1 = 1 
Left join dbo.SchoolSocialMedia ss ON ss.SchoolId = s.Id and ss.SocialMediaTypeKey = a.SocialMediaTypeKey 
where s.[DeactivatedDate] is null 

這是我多麼遠在C#中得到,但它不產生正確的結果 - - 事實上,它返回零結果:

 var departmentSocialMediaResult = 
      from ssm in context.SchoolSocialMedia 
      from d in context.Department.Where(d => d.Id == ssm.DepartmentId) 
      select new { ssm.SocialMediaTypeKey, 
       ssm.Url, 
       d.Name, 
       ssm.SchoolId }; 
     var result = 
      (from s in context.School 
      from ssm in context.SchoolSocialMedia.DefaultIfEmpty() 
      from dssm in departmentSocialMediaResult.DefaultIfEmpty() 
      .Where(dssm => dssm.SchoolId == s.Id && dssm.SocialMediaTypeKey == ssm.SocialMediaTypeKey) 
      select new { ssm.SchoolId, ssm.SocialMediaTypeKey, ssm.Url }) 
      .ToDictionary(ssm => new SchoolSocialMediaKey(
        ssm.SchoolId, ssm.SocialMediaTypeKey), 
       ssm => ssm.Url); 

有沒有人有關於如何更好地將T-SQL轉換爲LINQ to Entities的建議?我究竟做錯了什麼? TIA。

UPDATE:

謝謝@Aducci,你的反應是正確的答案。由於結果被放入一個字典,這是我最後使用:

 var query = 
      (from s in context.School 
      from a in 
      (
       from ssm in context.SchoolSocialMedia 
       join d in context.Department on ssm.DepartmentId equals d.Id 
       select new 
       { 
        ssm.SocialMediaTypeKey, 
        ssm.Url, 
        d.Name 
       } 
      ).DefaultIfEmpty() 
      from ss in context.SchoolSocialMedia 
           .Where(x => s.Id == x.SchoolId) 
           .Where(x => a.SocialMediaTypeKey == x.SocialMediaTypeKey) 
           .DefaultIfEmpty() 
      select new 
      { 
       ss.SchoolId, 
       Url = ss.Url ?? a.Url, 
       a.SocialMediaTypeKey 
      }).Distinct(); 

     return 
      query 
      .ToDictionary(
       ssm => new SchoolSocialMediaKey(
        ssm.SchoolId, ssm.SocialMediaTypeKey), 
       ssm => ssm.Url); 
+0

你能解釋一下查詢的含義嗎? –

+0

它需要返回SocialMediaKey類所需的值:query.ToDictionary( ssm => new SchoolSocialMediaKey( ssm.SchoolId,ssm.SocialMediaTypeKey), ssm => ssm.Url); – Roger

回答

1

我肯定有一個更好的方法來寫原始查詢,但不是花太多時間來分析我剛翻譯它進入linq。一般來說,你的linq查詢應該與tsql查詢具有相同的結構,如下所示:

var query = 
    from s in context.School 
    from a in 
    (
     from ssm in context.SchoolSocialMedia 
     join d in context.Department on ssm.DepartmentId equals d.Id 
     select new 
     { 
     ssm.SocialMediaTypeKey, 
     ssm.Url, 
     d.Name, 
     d.ImportBusinessKey 
     } 
    ).DefaultIfEmpty() 
    from ss in context.SchoolSocialMedia 
        .Where(x => s.Id == x.SchoolId) 
        .Where(x => a.SocialMediaTypeKey == x.SocialMediaTypeKey) 
        .DefaultIfEmpty() 
    select new 
    { 
     s.Code, 
     s.Name, 
     Url = ss.Url ?? a.Url, 
     a.SocialMediaTypeKey 
    };