Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架相关子查询_C#_Entity Framework_Correlated Subquery - Fatal编程技术网

C# 实体框架相关子查询

C# 实体框架相关子查询,c#,entity-framework,correlated-subquery,C#,Entity Framework,Correlated Subquery,我想使用实体框架来创建它。包含父记录字段和最新子记录字段的新对象列表。我会将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 db

我想使用实体框架来创建它。包含父记录字段和最新子记录字段的新对象列表。我会将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)的导航


无论我尝试什么,Linq都不正确,SQL也不正确。是时候请专家了。

这是一种方法,尽管有两个单独的db点击。您可以将第一条语句嵌入第二条语句,但这对我来说更复杂,因为我手头没有编译器

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

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

我假设您的实体名称与数据库表相同。这样做的结果是一系列保单及其相应的保单交易。

这并不漂亮,但我相信这能满足您的需求

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

不要害怕使用实体框架SQL操作来启动和运行您,并且现在就高兴了:。这里您获得的是整个PolicyTran表的最大修订日期,但要求获得每个策略的具有最大修订日期的PolicyTran。1保单有多个保单。对不起,我错了。好的,另一种方法是根本不使用include。您将首先获得按策略分组的最大修订日期列表。因此,这是一个PolicyTran的集合。然后可以对集合进行foreach并加载每个策略。加载策略的语法类似于context.Entry(yourlicytran.Reference(“policy”).load();这是一个幼稚、性能差的解决方案,因此不是一个非常有用的答案;目标是EF中的子查询,而这不是。
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
});