C# 获取不带匿名类型的父对象及其子对象计数
因此,我有了下一个方法(有效)返回C# 获取不带匿名类型的父对象及其子对象计数,c#,entity-framework,linq,C#,Entity Framework,Linq,因此,我有了下一个方法(有效)返回声明列表及其观察值。一个声明可以有零个或多个观察结果。代码可以工作,但我担心这会很混乱,使用匿名类型,然后将其解析为新的声明类型,设置计数 public async Task<IEnumerable<Claim>> GetClaims(ClaimStatusCode status, int take = 10, int skip = 0) { using (var db = new DataContext()) {
声明列表
及其观察值
。一个声明可以有零个或多个观察结果。代码可以工作,但我担心这会很混乱,使用匿名类型,然后将其解析为新的声明类型,设置计数
public async Task<IEnumerable<Claim>> GetClaims(ClaimStatusCode status, int take = 10, int skip = 0)
{
using (var db = new DataContext())
{
var pendingclaims = await (from claim in db.Claims
where claim.OfficeCode == _officeCode
where claim.ClaimStatusCode == status
select new
{
ID = claim.ID,
ClaimStatusCode = claim.ClaimStatusCode,
OpenDate = claim.OpenDate,
LastUpdateDate = claim.LastUpdateDate,
CloseDate = claim.CloseDate,
ProductCode = claim.ProductCode,
IssueCode = claim.IssueCode,
SpecificIssueCode = claim.SpecificIssueCode,
OfficeCode = claim.OfficeCode,
Summary = claim.Summary,
ObservationsCount = claim.Observations.Count
}).OrderBy(c => c.OpenDate).Take(take).Skip(skip).ToListAsync();
var list = new List<Claim>();
foreach (var claim in pendingclaims)
{
Claim c = new Claim()
{
ID = claim.ID,
ClaimStatusCode = claim.ClaimStatusCode,
OpenDate = claim.OpenDate,
LastUpdateDate = claim.LastUpdateDate,
CloseDate = claim.CloseDate,
ProductCode = claim.ProductCode,
IssueCode = claim.IssueCode,
SpecificIssueCode = claim.SpecificIssueCode,
OfficeCode = claim.OfficeCode,
Summary = claim.Summary,
ObservationsCount = claim.ObservationsCount
};
list.Add(c);
}
return list;
}
}
在EF6中,如果没有一些中间投影(即匿名类型或具体类型,只要它不是实体类型),就无法得到您想要的东西。但是,如果需要所有对象字段加上子项计数,则可以简化实现,如下所示:
var pendingclaims = await (from claim in db.Claims.AsNoTracking()
where claim.OfficeCode == _officeCode
where claim.ClaimStatusCode == status
orderby claim.OpenDate
select new
{
claim,
ObservationsCount = claim.Observations.Count
}).Take(take).Skip(skip).ToListAsync();
return pendingclaims.Select(item =>
{
item.claim.ObservationsCount = item.ObservationsCount;
return item.claim;
}).ToList();
当然,观察台是相当复杂和昂贵的。我不能用select和
Include
加载每个索赔的所有观察数据。对于前面的评论员:EF不允许投影到实体类型,因此使用中间匿名投影来解决该限制。@RandolfRincónFadul您能显示索赔
类吗?我想知道您是否为该类选择了所有字段?我猜,observationscont
是未映射属性?@IvanStoev,是的,EF不允许。是的,我正在选择所有字段。我首先在一对多关系“虚拟ICollection”中使用实体代码来声明观察结果。查询部分确实起了作用。但是对于第二部分,投影与方法签名不匹配。因此,最终创建了列表+1感谢您记住了重要的AsNoTracking()
。不客气:)并对愚蠢的错误表示抱歉,已修复。
public class Observation
{
public Observation()
{ }
[Key]
public Guid ID { get; set; }
...
public virtual Guid ClaimID { get; set; }
[ForeignKey("ClaimID")]
public virtual Claim Claim { get; set; }
}
var pendingclaims = await (from claim in db.Claims.AsNoTracking()
where claim.OfficeCode == _officeCode
where claim.ClaimStatusCode == status
orderby claim.OpenDate
select new
{
claim,
ObservationsCount = claim.Observations.Count
}).Take(take).Skip(skip).ToListAsync();
return pendingclaims.Select(item =>
{
item.claim.ObservationsCount = item.ObservationsCount;
return item.claim;
}).ToList();