2020年4月24日 星期五

Blazor 使用 資料模型 來顯示資料表關聯的集合資料

Blazor 使用 資料模型 來顯示資料表關聯的集合資料

在上一篇文章 在 Blazor 專案內使用 Syncfusion 的 DataGrid 套件 中,使用 Syncfusion 的 DataGrid 元件顯示這些資料,在這將會需要把資料庫內表格 Table 的關聯紀錄,使用 Syncfusion DataGrid 來顯示出來,這裡暫時先不使用 AutoMapper 來實現這樣的功能,而是建立一個資料模型類別,且搭配使用 LINQ 來做到。
這個說明專案的原始碼位於 bzSyncfusionDataGridModel

修正 DataGrid 元件

  • 打開 [Pages] 資料夾內的 [index.razor] 檔案,輸入底下 HTML 標記與程式碼
@page "/"
@using bzEntityFrameworkCore.Models
@using Microsoft.EntityFrameworkCore
@inject ContosoUniversityContext Context

<h1>Hello, Entity Framework Core</h1>

<button class="btn btn-primary" @onclick="LoadData">讀取資料庫</button>

<SfGrid DataSource="@records">
    <GridColumns>
        <GridColumn Field=@nameof(RowData.CourseId) HeaderText="序號" TextAlign="TextAlign.Right" Width="120"></GridColumn>
        <GridColumn Field=@nameof(RowData.Title) HeaderText="課程名稱" Width="150"></GridColumn>
        <GridColumn Field=@nameof(RowData.Credits) HeaderText=" Credits" Format="d" Type="ColumnType.Date" TextAlign="TextAlign.Right" Width="130"></GridColumn>
        <GridColumn Field=@nameof(RowData.Name) HeaderText="科系" TextAlign="TextAlign.Right" Width="120"></GridColumn>
    </GridColumns>
</SfGrid>
@code{
    class RowData
    {
        public int CourseId { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }
        public string Name { get; set; }
    }

    List<RowData> records = new List<RowData>();
    async void LoadData(MouseEventArgs e)
    {
        var rows = await Context.Course.Include(x => x.Department).ToListAsync();

        // 這裡使用 LINQ 宣告式語言來實現
        var query = from c in rows
                    select new RowData
                    {
                        CourseId = c.CourseId,
                        Title = c.Title,
                        Credits = c.Credits,
                        Name = c.Department.Name
                    };
        records = query.ToList();

        //// 這裡使用 LINQ 延伸方法來實現
        //records = rows.Select<Course, RowData>((x, y) =>
        //new RowData
        //{
        //    CourseId = x.CourseId,
        //    Title = x.Title,
        //    Credits = x.Credits,
        //    Name = x.Department.Name
        //}).ToList();

        StateHasChanged();
    }
}
在此將建立一個 RowData 類別,該類別將會用於顯示每筆紀錄所用的資料模型,而在資料庫那哩,因為要取得 Department 這個關聯資料表內的相關紀錄,因此,需要使用 Include(x => x.Department) 這個方法呼叫,如此,在資料庫端將會執行 Table Join 的查詢動作;另外,當資料查詢出來之後,將會透過 LINQ 的功能,將資料庫讀取出來的紀錄內容,轉換成為資料模型 RowData 型別的物件。
  • 執行這個專案,將會看到使用 Syncfusion DataGrid 元件顯示出底下的輸出內容,若有看到,就代表已經成功讀取資料庫紀錄了。




沒有留言:

張貼留言