【问题标题】:Query from one to many relation database to datatable从一对多关系数据库查询到数据表
【发布时间】:2022-01-10 12:44:15
【问题描述】:

我刚开始使用 SQL,并试图让我的第一个示例正常工作。我有两个具有一对多关系的表:

public class Customer
{
    public Guid Id { get; set; }
    public string CompanyName { get; set; }
    public string Address { get; set; }
    [JsonIgnore]
    public virtual ICollection<Project> Projects { get; set; }
}

public class Project
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string ProjectType { get; set; }
    public Guid CustomerId { get; set; }
    public Customer Customer { get; set; }
}

然后我通过 API ProjectsController 执行以下命令:

[HttpGet]
public async Task<IActionResult> Get()
{
    System.Collections.Generic.List<Project> projects = 
         await _context.Projects.Include(d => d.Customer).ToListAsync();
    return Ok(projects);
}

我得到了我的

private IEnumerable<Project> ProjectsList { get; set; } = new List<Project>();

在剃须刀页面上,与

this.ProjectsList = await this.HttpClient.GetFromJsonAsync<IEnumerable<Project>>("api/Projects");

我已经用调试器检查了ProjectsList 的数据结构,它看起来很好。

但是:Razor 页表(两列“项目名称”和“客户名称”):

<Table DataSource="ProjectsList" TItem="Project">
  <Column TData="string"
          Title="Name"
          @bind-Field="context.Name"
          SorterCompare="@((a,b)=> string.Compare(a,b))"
          SortDirections="new[] { SortDirection.Descending }"
          Filterable />
    <Column TData="string"
    @bind-Field="context.Customer.CompanyName"
    SorterCompare="@((a,b)=> string.Compare(a,b))"
    SortDirections="new[] { SortDirection.Descending }"
    Filterable />
</Table>

我得到一个未设置为对象实例的对象异常。我猜这是因为context.Customer.CompanyName 没有初始化Customer

首先我有一个问题,我应该重做我的Project 模型并在那里添加额外的字符串类型列CompanyName,还是有其他方法可以让数据显示在剃须刀页面上?

如果...我应该在Project.cs 中添加额外的列,如何在其中使用 linq 查询数据?

【问题讨论】:

  • 将来您可能希望使用var 通过省略变量类型来缩短您的代码,并使用using 来缩短命名空间。
  • 您可以尝试将其改为context.Customer?.CompanyName 吗?你能检查一下 null 在哪里吗?
  • @HiFo - 一个问题。您是否考虑过将应用程序逻辑(客户和项目之间的关系)构建到数据层中?我知道 EF 允许,几乎鼓励这样做,但是你建立的关系越复杂,就越难(咒骂而不是打字)找出问题所在。另一种方法是将这些关系构建到您的核心应用程序层中。复杂性没有改变,但都是 C# 代码。你可以调试它,并模拟它进行测试!
  • @MrCakaShaunCurtis 我目前只是在练习,但是是的,我需要更详细地研究我的应用程序的架构。我现在已经看到很多架构示例的示例,因此我很难选择一个,因为我还不了解每个示例的好处。目前我只有客户端、服务器和共享。
  • @HiFo。有许多竞争的替代品!我已经根据此处所谓的“干净”设计原则 - github.com/ShaunCurtis/Blazr.Demo 构建了 Blazor 解决方案和模板。它至少会给你一个以 Blazor 为中心的起点。

标签: c# sql asp.net linq blazor


【解决方案1】:

首先,尝试以下操作,如果出现错误,请在此处发布其文本:

public Customer Customer { get; set; } = new Customer {};

【讨论】:

  • 如果他使用的是 EF Core,我认为没有客户就无法拥有项目。 Guid 不能为 null,如果 OP 启用了 Nullable Ref,则引用也不能为 null。但如果确实是问题所在,我相信你不应该这样做,因为看起来代码也被用于 EF Core 的服务器端。
猜你喜欢
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 2021-09-01
  • 2013-09-29
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
相关资源
最近更新 更多