簡體   English   中英

Entity Framework Core,從具有聚合的二級相關表中檢索數據 function

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM