2016-06-22 12 views
0

だからここに私はビューLINQクエリにビューからコードを移動

reportData = dbContext.FinancialsBySupplierAuditPeriodStatusType 
        .Where(v => v.ReviewPeriodID == reportFilter.ReviewPeriodID && v.StatusCategoryID == reportFilter.StatusCategoryID && v.ClientID == reportFilter.ClientId) 
        .GroupBy(s => new { s.SupplierID }) 

        .Select(g => new DrilldownReportItem { 
         SupplierID = g.Key.SupplierID, 
         SupplierName = g.Max(v => v.SupplierName), 
         AccountNo = g.Max(v => v.AccountNo), 
         SuppTotals = g.Select(v => new TempTotals { ClaimType = v.TypeDesc ?? "Old Claims", Amount = v.Amount ?? 0 }) 
        }).OrderBy(r => r.SupplierName).ToList(); 

SuppTotalsのためのデータを返すこのクエリは内ClaimTypesのそれぞれとIEnumerableを含んでいる問題は、あるしかしそうではないかもしれませんそのレコードに値がない場合はすべての単一のClaimTypeを含みます。したがって、ビューには5つの見出しがありますが、テーブル行には2つの結果しかありません。

たとえば、5つのClaimTypesがありますが、そのレコードには1つしかありません。この場合、ビューで見出しが一致し、データが空白になります。

は、私は私の質問は、私はこのコードを配置する必要がないように、これは、クエリ自体に範囲を追加組み込む方法がある。この

var existing = i.SuppTotals.Select(x => x.ClaimType); 

    var toAdd = Model.ClaimHeadings.Except(existing).Select(x => new TempTotals { 
     ClaimType = x, 
      Amount = 0 
      }); 

var row = i.SuppTotals.ToList(); 
row.AddRange(toAdd); 

@foreach (var item in Model.ClaimHeadings) { 
     <td><span class="text">@String.Format("{0:C0}", row.Where(c => c.ClaimType == item).First().Amount)</span></td> 

とビュー上で、この問題を修正しましたビューとクエリでそれを持っています。ここ

--Update--

は、請求項Typeエンティティ

public partial class ClaimType 
    { 
     [Key][Column(Order = 0)] 
     public int ClientID { get; set; } 

     [Key][Column(Order = 1)] 
     [StringLength(2)] 
     //WAS STRING 
     public string TypeID { get; set; } 

     [StringLength(50)] 
     public string TypeDesc { get; set; } 

     [StringLength(2)] 
     public char OldTypeID { get; set; } 

}   

であり、このコードは、レポートデータにしたものに追加して0の量と要求の種類のすべてを引っ張る

var claimTypes = _claimManager.GetClaimTypes(PredicateBuilder.True<ClaimType>().And(x => x.ClientID == reportFilter.ClientId)).Select(x => new TempTotals { 
        ClaimType = x.TypeDesc, 
        Amount = 0 
       }); 
+0

あなたは「ClaimTypes」について語りかけています。彼らはどこから来たの?すなわち、あなたはいくつかのエンティティ(テーブル)を持っていますか? –

+0

クレームの種類はテーブル内に保存されていますエンティティとクエリとそれらをプルするために使用するコードを使用して質問を更新しました –

+0

これをWebページに表示しているので、 'ClaimTypes'を呼び出して返された値を確認してください –

答えて

1

あなたはアンチ結合Concatを使用して、各グループに欠落している要求の種類を追加してみてくださいすることができます

SuppTotals = g.Select(v => new TempTotals { ClaimType = v.TypeDesc ?? "Old Claims", Amount = v.Amount ?? 0 }) 
      .Concat(from ct in dbContext.ClaimType 
        join v in g on ct.TypeDesc equals v.TypeDesc into match 
        from v in match.DefaultIfEmpty() 
        where v == null 
        select new TempTotals { ClaimType = ct.TypeDesc, Amount = 0 }) 
+0

これはスローする " " TempTotalsタイプの定数値を作成できません。または列挙型がこのコンテキストでサポートされています。 –

+0

まあ、私は似たようなクエリを試してみましたが、それは動作します(EF6.1.3、SqlServer db) –

+1

これは、それが正常だったことを修正した後、何か他に起こっていたからです。乾杯 –

関連する問題