2012-02-13 151 views
0

我弄明白了。 無需回答。該系統說我必須等待8個小時才能回答我自己的問題。但現在的答案是如下:LINQ to Entities:轉換SQL子選擇

下面是答案:

var startDate = DateTime.Today.AddDays(-30);  
var results = (from h in Histories 
       join q in Quotes 
        on h.QuoteID equals q.QuoteID 
       join a in Agencies 
        on q.AgencyID equals a.AgencyID    
         where q.Status == "Inforce" && 
           q.LOB == "Vacant" &&   
           q.EffectiveDate > startDate && 
           h.Deleted == null && 
           h.DeprecatedBy == null &&          
           h.TransactionStatus == "Committed" &&           
           a.DC_PLT_Roles.Any(r => r.Name == "Wholesaler") 
         group new {h} by new {h.PolicyNumber} into g   
         select new {         
          MaxHistoryID = g.Max (x => x.h.HistoryID), 
          comment = (from h2 in Histories 
            where h2.HistoryID == g.Max (x => x.h.HistoryID) 
            select h2.Comment).FirstOrDefault() 
          }).ToList(); 

的關鍵代碼爲:

comment = (from h2 in Histories 
            where h2.HistoryID == g.Max (x => x.h.HistoryID) 
            select h2.Comment).FirstOrDefault() 

我們是在把SQL /存儲過程LINQ的過程到實體報表。我無法弄清楚子選擇的正確語法。

目前我轉換這個SQL:

declare @startDate DateTime 
set @startDate = DATEADD(DD, -30, GETDATE()) 

select * from history where historyid in(  
select MAX(h.historyid) as HistoryId 
    from History h (nolock) 
    inner join Quote q (nolock) on h.QuoteID = q.QuoteID 
    inner join Agency (nolock) a on q.AgencyID = a.AgencyID 
    inner join DC_PLT_EntityRoles er (nolock) on a.AgencyID = er.EntityID 
    inner join DC_PLT_Roles (nolock) r on er.RoleID = r.RoleID 
    where 
      q.Status = 'Inforce' 
      and q.LOB = 'Vacant' 
      and q.EffectiveDate > @startDate 
      and h.Deleted is null -- 
      and h.DeprecatedBy is null -- 
      and h.TransactionStatus = 'Committed' 
      and r.Name = 'Wholesaler' 
    group by h.PolicyNumber) 

正如你可以看到上面的代碼是由兩個選擇語句。主要選擇(從歷史中選擇*)......和過濾器選擇(選擇MAX(h.historyid)...)

我得到的過濾器中選擇工作(見下文):

var startDate = DateTime.Today.AddDays(-30);  
var results = (from h in Histories 
       join q in Quotes 
        on h.QuoteID equals q.QuoteID 
       join a in Agencies 
        on q.AgencyID equals a.AgencyID    
         where q.Status == "Inforce" && 
           q.LOB == "Vacant" &&   
           q.EffectiveDate > startDate && 
           h.Deleted == null && 
           h.DeprecatedBy == null &&          
           h.TransactionStatus == "Committed" &&           
           a.DC_PLT_Roles.Any(r => r.Name == "Wholesaler") 
         group new {h} by new {h.PolicyNumber} into g   
         select new {         
          MaxHistoryID = g.Max (x => x.h.HistoryID)       
          }).ToList(); 

不過,我可以沒有找出正確的語法來設置主選擇。 (基本上從歷史記錄表中使用過濾器選擇的HistoryID獲取記錄。)

任何幫助,將不勝感激。

感謝您的幫助。

回答

0

我想通了,這裏是代碼:

var startDate = DateTime.Today.AddDays(-30);  
var results = (from h in Histories 
         .Include("Quote") 
         .Include("Quote.Agency")          
         where h.Quote.Status == "Inforce" &&  
           h.Quote.LOB == "Vacant" &&  
           h.Quote.EffectiveDate > startDate && 
           h.Deleted == null && 
           h.DeprecatedBy == null &&          
           h.TransactionStatus == "Committed" &&           
           h.Quote.Agency.DC_PLT_Roles.Any(r => r.Name == "Wholesaler")        
         group new {h} by new {h.PolicyNumber} into g   
         select new { 
          XMLData = (from h2 in Histories 
             where h2.HistoryID == g.Max (x => x.h.HistoryID) 
             select h2.XMLData).FirstOrDefault() 
          }).ToList(); 

關鍵的邏輯是:

select new { 
          XMLData = (from h2 in Histories 
             where h2.HistoryID == g.Max (x => x.h.HistoryID) 
             select h2.XMLData).FirstOrDefault() 
          }).ToList(); 

愛是愛嵌套查詢