2016-06-22 2 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 содержит IEnumerable с каждым из ClaimTypes в, однако они не могли бы содержат каждый тип ClaimType, если для этой записи нет значения, поэтому на представлении будет 5 заголовков, но в строке таблицы будут только два результата.

например, существует 5 ClaimTypes, но эта запись имеет только один из них, это значит, что в представлении не разрешены заголовки, и данные отображаются пустыми.

Я исправил эту проблему на представлении с этим

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

здесь Претензия Тип Entity

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

Как вы показываете это на веб-странице, почему бы не использовать список флажков с несколькими выборами, основанный на 'ClaimTypes', а затем проверить возвращаемые значения –

ответ

1

Вы можете попробовать добавить недостающие типы претензий к каждой группе, используя antijoin и 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

Это было из-за чего-то еще, что у меня было, после исправления, что все в порядке. ура –

Смежные вопросы