c# - 在没有匿名类型的情况下获取父对象及其子对象计数

标签 c# entity-framework linq

所以我有下一个方法(有效)来返回 claims 及其 observations 的列表。一项声明可以有零个或多个观察值。代码有效,但我担心它是一团糟,匿名类型然后将其解析为新的 Claim 类型,设置计数。

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

我想我可能遗漏了一些东西来减少生成的 SQL 查询的困惑,但不知道是什么。有什么想法吗?

更新

根据要求,这是 Claim 和 Observation 类,我使用的是简单的实体代码第一个一对多关系:

claim

public class Claim
{
    public Claim()
    {
        Observations = new List<Observation>();
    }

    [Key]
    public Guid ID { get; set; }

    ...

    public virtual ICollection<Observation> Observations { get; set; }

    [NotMapped]
    public int ObservationsCount { get; set; }
}

观察

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

最佳答案

如果没有一些中间投影(无论是匿名类型还是具体类型,只要它不是实体类型),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();

关于c# - 在没有匿名类型的情况下获取父对象及其子对象计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40949537/

相关文章:

c# - 比较 : LINQ vs LAMBDA Expression

c# - 使用 MVVM,当控件没有 "Command"属性时怎么办?

c# - 如何设置ListView的ItemsSource?

c# - 在嵌入式媒体播放器中播放音频

c# - 在 C# 中检测 CPU 的管理程序标志

c# - 如何按字母分组并放入相同的字母大小

c# - 努力抛出 InvalidOperationException : Sequence contains more than one matching element

sql - EF 核心代码优先迁移自动为表添加 db_owner 前缀

c# - Linq( Entity Framework )select中如何选择

LINQ 将字符串转换为日期时间