2013-07-04 111 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 
});