Так вот проблема, я этот запрос, который возвращает данные для представленияПеремещение кода из представления в запрос 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
});
Вы говорите о 'ClaimTypes'. Откуда они взялись? то есть у вас есть какой-либо объект (таблица) или? –
Типы претензий хранятся в таблице. Я обновил вопрос с сущностью и запросом и кодом, который я использую, чтобы вытащить их. –
Как вы показываете это на веб-странице, почему бы не использовать список флажков с несколькими выборами, основанный на 'ClaimTypes', а затем проверить возвращаемые значения –