LINQ to Entities: конвертировать SQL Sub Select - PullRequest
0 голосов
/ 13 февраля 2012

Я понял это. Не нужно отвечать. Система говорит, что мне нужно подождать 8 часов, прежде чем отвечать на мои собственные вопросы. Но пока ответ ниже:

Вот ответ:

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 to Entities. И я не могу понять правильный синтаксис для подвыбора.

В настоящее время я конвертирую этот 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 из фильтра select).

Буду признателен за любую помощь.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 14 февраля 2012

Я разобрался, вот код:

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

Должен любить вложенный запрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...