2013-03-15 72 views
0

我试图让这个查询到的LINQLINQ的LEFT JOIN不工作

SELECT [ID], [Name], LastSync, Phase 
FROM [Store] 
LEFT JOIN (
    SELECT GLog.[StoreId] AS [StoreId], LastSync, Phase 
    FROM [GGCSyncLog] AS GLog 
    INNER JOIN (
     SELECT MAX(G1.[DateTime]) AS LastSync, G1.[StoreId] 
     FROM [GGCSyncLog] AS G1 
     GROUP BY G1.[StoreId] 
     ) AS G2 ON (GLog.[StoreId] = G2.[StoreId]) AND (GLog.[DateTime] = G2.[LastSync]) 
    ) AS MostRecentLog ON Store.[ID] = MostRecentLog.[StoreId] 

其结果是

ID Name     LastSync  Phase 
1 Sarasota    2010-07-31 5 
2 Wellington   2010-07-31 8 
3 Tampa International 2013-03-12 8 
5 Events    NULL   NULL 
6 PO Holding Store  NULL   NULL 

我的LINQ返回正确的结果,除了我错过了两行与null LastSync &阶段。任何想法有什么不对?

from s in Stores 
join gLog in 
(from g1 in GGCSyncLogs.DefaultIfEmpty() 
join g in 
(from g in GGCSyncLogs 
group g by g.StoreId into gM 
    select new { 
    StoreId = gM.Key, LastSync = gM.Max(gg=>gg.DateTime) }) 
    on new {g1.StoreId, LastSync = g1.DateTime} equals new {g.StoreId, g.LastSync} 
    select new {g1.StoreId, g.LastSync, g1.Phase}) 
    on s.ID equals gLog.StoreId 
     select new {s.ID, s.Name, 
      LastSync = (gLog != null ? (DateTime?)gLog.LastSync : null), 
      Phase = (gLog != null ? (int?)gLog.Phase : null) } 
+2

在LINQ'加入'和* inner join *相同。对于* left join *使用'join .. into'语法。 – 2013-03-15 16:49:09

+0

明白了。这正是问题所在。 – strattonn 2013-03-15 18:55:45

回答

0

我不得不使用“到”

from s in Stores 
join gRec in 
(from g in GGCSyncLogs 
join g2 in 
(from g1 in GGCSyncLogs 
group g1 by g1.StoreId into gM 
    select new {StoreId = gM.Key,LastSync = gM.Max(gg=>gg.DateTime)}) 
    on new {g.StoreId, LastSync = g.DateTime} equals new {g2.StoreId, g2.LastSync} 
    select new {g.StoreId, g2.LastSync, g.Phase}) 
    on s.ID equals gRec.StoreId into gRec2 
    from gRec3 in gRec2.DefaultIfEmpty() 
    select new {s.ID, s.Name, 
        LastSync = (gRec3 != null ? (DateTime?)gRec3.LastSync : null), 
        Phase = (gRec3 != null ? (int?)gRec3.Phase : null) } 
0

您应该阅读约join clauseHow to: Perform Left Outer Joins

很难在这里得到任何数据库工作的解决方案,但希望这将帮助你回到正轨:

var g2 = from g1 in GGCSyncLogs 
     group g1 by g1.StoreId into gM; 

var MostRecentLogs = from gLog in GGCSyncLogs 
        join g in g2 on new { gLog.StoreId, LastSync = gLog.DateTime} equals new { g.StoreId, g.LastSync } 
        select new { gLog.StoreId, LastSync = gLog.Date, Phase = gLog.Phase }; 

var results = from s in Stores 
       join gLog in MostRecentLogs on s.Id equals gLog.StoreId into gl 
       from l in gl.DefaultIfEmpty(new { LastSync = null, Phase = null }) 
       select new { 
        s.Id, 
        s.Name, 
        l.LastSync, 
        l.Phase 
       }; 
+0

感谢您的回应,但我在第一条评论的帮助下同时完成了这项工作。 – strattonn 2013-03-23 00:44:23