如何仅检索LINQ中的某些子对象?
我有一个实体对象(Company),它有一个或多个子对象(CompanyRevision),在数据库中表示为非空FK关系。 使用LINQ,我希望从数据库中获取所有公司,但我也只希望每个公司的最新CompanyRevision。 我今天就是这样做的,但我觉得这可以用一个查询来完成如何仅检索LINQ中的某些子对象?,linq,linq-to-entities,Linq,Linq To Entities,我有一个实体对象(Company),它有一个或多个子对象(CompanyRevision),在数据库中表示为非空FK关系。 使用LINQ,我希望从数据库中获取所有公司,但我也只希望每个公司的最新CompanyRevision。 我今天就是这样做的,但我觉得这可以用一个查询来完成 IEnumerable<Company> companyList = from p in ctx.Company.Include("CompanyRevisions")
IEnumerable<Company> companyList = from p in ctx.Company.Include("CompanyRevisions")
select p;
foreach(Company c in companyList)
{
CompanyRevision cr = (from p in c.CompanyRevisions
orderby p.Timestamp descending
select p).First();
// Do something with c and cr...
}
IEnumerable companyList=来自ctx.Company.Include中的p(“CompanyRevisions”)
选择p;
foreach(公司列表中的公司c)
{
CompanyRevision cr=(来自c.CompanyRevision中的p
orderby p.时间戳递减
选择p.First();
//用c和c做点什么。。。
}
如您所见,我想将第二个LINQ查询(获取最新CompanyRevision的查询)添加到第一个查询中,这样companyList[I].CompanyRevisions基本上就是一个只有一个条目(最新条目)的列表。我一辈子都不知道该怎么做。请帮忙
提前感谢如何:混合linq语言和扩展方法:
var results = from p in ctx.Company.Include("CompanyRevisions")
select new {Company = p,
Revision = p.CompanyRevisions.OrderByDescending(cr => cr.Timestamp).First()
}
现在,每个结果都有一个公司和修订成员
你也可以这样做-
var results = from p in ctx.Company.Include("CompanyRevisions")
select new {Company = p,
Revision = (from pcr in p.CompanyRevisions
orderby pcr.Timestamp descending
select pcr).First()
}
给出相同的结果
虽然这是一个猜测,但我还没有把它说出来;但这是我将首先尝试的方式。虽然这会起作用,但我担心此解决方案仍会转换为SQL级别的完整内部联接,并且会从数据库返回实际需要的更多数据,这是这里关注的问题之一。@David-不应该-您当前的解决方案在服务器和客户端之间产生的数据传输比此解决方案多-因为只有您感兴趣的两条记录将在所有公司的一次往返中返回。您当前的解决方案返回相同的数据,但为n+1往返-其中n是第一个可枚举结果中的公司数。
Include
在这里是多余的;投射时没有必要/没用。最坏的情况是,它会强制加载大卫不想要的东西。不过,剩下的答案是正确的。@Craig-你关于包括的说法是对的,当然-我睡眠不足!:)