[英]Entity Framework Core, retrieve data from second level related table with aggregation function
我有一種情況想嘗試,它不會讓我晚上睡不着覺。 本質上,我想在視圖中顯示卡片(bootstrap 類型),對於每個人(這只是一個類比的例子),顯示相關的特征和最后一次測量的值(例如,想象身高是在 5 年和 10 年時測量)。 在類似於下圖的情況下,最好采用代碼中報告的唯一邏輯(抱歉,我是一個熱愛編程的愛好者,不幸的是我沒有研究過)下面還是使用局部視圖更好? 在第二種情況下,它們是如何實現二級或更高級別的,最后日期的值如何與每個特征相關聯?
我會得到什么: https://codepen.io/lucora/pen/jOKQpGY
這是我的方法:
查看 MODEL
public class ViewModel
{
public IEnumerable<PersonViewModel>? People { get; set; }
public IEnumerable<FeaturesViewModel>? Features { get; set; }
}
public class PersonViewModel
{
public int Id { get; set; }
public string Name{ get; set; } = string.Empty;
public string? Surname { get; set; }
public ICollection<FeaturesViewModel>? FeaturesViewModel{ get; set; }
}
public class FeaturesViewModel
{
public virtual PersonViewModel? People { get; set; }
public int Id { get; set; }
public string? Feature{ get; set; } = string.Empty;
public DateTime? DateLastValue { get; set; } = default;
public String? StringLastValue { get; set; } = string.Empty;
}
CONTROLLER
var myPeople = _context.Person!.Select(x => new PersonViewModel
{
Id = (int)x.Id!,
Name = x.Name,
Surname = x.Surname
});
var myFeatures = _context.Features!.Select(x => new FeaturesViewModel
{
Id = x.Id,
PersonId = (int)x.PersonId!,
Feature = x.Feature,
DateLastValue = x.Features.Feature-Value.Max(x => x.DateTimeMeasure),
//StringLastValue = ????
});
ViewModel VM = new();
VM.People = myPeople;
VM.Features = myFeatures;
return View(VM);
看法
@model VM
<div class="row">
<div class="col-md-4">
<h3>PEOPLE: </h3>
</div>
</div>
<br />
<div class="row">
@foreach (var item in Model.People!)
{
@*<img src=@item.Logo class="card-img-top" alt="...">*@
<div class="card-body">
<h5 class="card-title">@item.Surname.ToUpper()</h5>
<h6 class="card-text mb-2 text-muted">@Html.DisplayFor(modelItem => item.Name)</h6>
<hr />
<p class="card-text">
FEATURES:
</p>
<hr/>
<p class="card-text">
@foreach (var feat in Model.Features!.Where(x=>x.PersonId == item.Id))
{
<div class="row">
<div class="col">
@feat.Feature - @feat.StringFeatureValue ??
</div>
</div>
} //end of Features
</p>
} //end of foreach People
</div>
你可以試試這樣:
您的視圖模型
public class ViewModel
{
//the only one list you need in the view
public IEnumerable<PersonViewModel> People { get; set; }
}
public class PersonViewModel
{
public int Id { get; set; }
public string Name{ get; set; }
public string Surname { get; set; }
// All persons features
public ICollection<FeaturesViewModel> Features { get; set; }
}
public class FeaturesViewModel
{
public int Id { get; set; }
public string Feature{ get; set; }
// last feature value by datetime
public FeatureValueViewModel LastFeatureValue { get; set; }
}
public class FeatureValueViewModel
{
public DateTime DateTimeMeassure { get; set; }
public string MeasureValue { get; set; }
}
Controller
//If you have the right relations, You can take all the data you need that way
var people = _context.Person.Select(x => new PersonViewModel
{
Id = x.Id,
Name = x.Name,
Surname = x.Surname
Features = x.Features.Select(y => new FeaturesViewModel
{
Id = y.Id,
Feature = y.Feature,
LastFeatureValue = y.FeatureValues.OrderByDescending(x => x.DateTimeMeashure).FirstOrDefault(),
}).ToList();
}).ToList();
ViewModel VM = new();
VM.People = myPeople;
return View(VM);
看法
@model VM
<div class="row">
<div class="col-md-4">
<h3>PEOPLE: </h3>
</div>
</div>
<br />
<div class="row">
@foreach (var person in Model.People)
{
@*<img src=@item.Logo class="card-img-top" alt="...">*@
<div class="card-body">
<h5 class="card-title">@item.Surname.ToUpper()</h5>
<h6 class="card-text mb-2 text-muted">@Html.DisplayFor(modelItem => item.Name)</h6>
<hr />
<p class="card-text">
FEATURES:
</p>
<hr/>
<p class="card-text">
//
@foreach (var feat in person.Features )
{
<div class="row">
<div class="col">
@feat.LastFeatureValue.DateTimeMeassure - @feat.LastFeatureValue.MeasureValue
</div>
</div>
} //end of Features
</p>
} //end of foreach People
</div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.