2013-07-04 150 views
4

我想創建這個使用實體框架。新對象的列表,其中包含來自父代的字段和來自最新子記錄的字段。我會將SQL作爲相關子查詢寫入:實體框架相關子查詢

SELECT p.PolicyNumber, p.HomeState, pt.RevisionDate, pt.TranStatus 
FROM dbo.Policy p 
JOIN dbo.PolicyTran pt ON p.Id = pt.Policy_Id 
AND pt.RevisionDate = (
    SELECT MAX(mpt.RevisionDate) 
    FROM dbo.PolicyTran mpt 
    WHERE p.Id = pt.Policy_Id 
    ) 
WHERE p.HomeState = 'NY' 

策略的上下文已導航到事務列表(PolicyTran)。

var query = context.Policies.Include(t => t.PolicyTransactions); 

不管我怎麼努力LINQ的不正確或SQL不正確。有時間打電話給專家。

+0

不要害怕使用實體框架的SQL操作,讓你和運行,快樂,現在:http://msdn.microsoft.com/en-us/data/jj592907.aspx。 –

回答

-1

這是一種方法,雖然2個單獨的數據庫命中。你可能會將第一條語句嵌入到第二條語句中,但現在對於我來說這更復雜,因爲我沒有編譯器。

var maxRevisionDate = context.PolicyTran.Max(x => x.RevisionDate); 

var results = context.Policies.Where(x => x.PolicyTran.RevisionDate == maxRevisionDate 
       && x.HomeState == "NY").Include("PolicyTran") 

我假設您的實體名稱與您的數據庫表是相同的。這樣做的結果是IEnumerable策略及其相應的PolicyTrans。

+0

在這裏,您將獲得整個PolicyTran表的最大修訂日期,但是需求是獲取每個策略的最大RevisionDate的PolicyTran。 1政策有多個PolicyTrans –

+1

對不起我的錯誤。好的,另一種方法是根本不使用包含。您首先獲得按策略分組的最新修訂日期列表。所以這個結果是一個PolicyTran的集合。然後,您可以對該集合進行foreach並加載每個策略。加載策略的語法類似於context.Entry(yourPolicyTran).Reference(「Policy」)。Load(); – Shumii

+0

這是天真的,性能低下的解決方案,所以不是一個非常有用的答案;目標是EF中的一個子查詢,而這不是。 –

0

這不是很漂亮,但我相信這會讓你得到你想要的。

var query = db.Policies 
.Where(p => p.HomeState == "NY") 
.Join(db.PolicyTrans, 
    p => p.Id, 
    t => t.Policy_Id, 
    (p, t) => new { P = p, T = t.OrderBy(tr => tr.RevisionDate).First() }) 
.Select(g => new { 
    PolicyNumber = g.P.PolicyNumber, 
    HomeState = g.P.HomeState, 
    TransStatus = g.P.TransStatus, 
    RevisionDate = g.T.RevisionDate 
});