2016-12-03 3 views
1

したがって、claimsとそのobservationsのリストを返す次のメソッド(動作)があります。 1つのクレームは、ゼロまたは多数の観測値を持つことができます。コードは機能しますが、私は匿名のタイプで混乱してしまい、それを新しいクレームタイプに解析してカウントを設定します。親オブジェクトとその子カウントを匿名型なしで取得する

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クエリの混乱を減らすために何かが欠けていると思うが、何を理解していません。何か案が?

UPDATE要求されたよう

は、ここで私は多くの関係に無地のシンプルなエンティティコード最初のものを使用しています、クレームと観測クラスです:

請求

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

確かに、観測テーブルはかなり複雑で高価です。私は各クレームのObservationデータをselectとIncludeで読み込むことはできません。 –

+0

前のコメント作成者の方:EFではエンティティタイプへの投影が許可されていないため、この致命的な制限を回避するために中間の匿名投影が使用されています。 –

+0

@RandolfRincónFadul 'Claim'クラスを表示できますか?あなたはそのクラスのすべてのフィールドを選択したのだろうか?そして、ObservationsCountはマップされていないプロパティだと思いますか? –

答えて

3

Ther eは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(); 
+0

質問部分がうまくいった。しかし、2番目の部分については、投影法のメソッドシグネチャと一致しません。結局、リストが作成されました。 +1と重要な 'AsNoTracking()'を覚えてくれてありがとう。 –

+0

あなたは歓迎です:)そして、愚かな間違いのために申し訳ありません、修正されました。 –

関連する問題