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