【问题标题】:Instead of using single() to return one item in a table, how can I return multiple items tied to the same ID in a list?与其使用 single() 返回表中的一项,如何返回与列表中相同 ID 绑定的多个项?
【发布时间】:2021-09-09 19:43:12
【问题描述】:

我正在创建一个联系人管理数据库作为一个项目,并使用剃须刀页面创建了联系人和活动表。在单个联系人的页面上,我想返回与其 ID 相关的所有活动的列表,而不仅仅是单个活动。这是我的设置方式:

public Contact Contact { get; set; }
public List<Activity> Activity { get; set; }

public async Task<IActionResult> OnGetAsync(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    Contact = await _context.Contact
        .Include(c => c.Location)
        .Include(c => c.Role)
        .Include(c => c.State).FirstOrDefaultAsync(m => m.ContactID == id);

    Activity = await _context.Activity
        .Include(c => c.ActivityTask)
        .Where(m => m.ContactID == id)
        .ToListAsync();

    if (Contact == null)
    {
        return NotFound();
    }
    return Page();
}

然后我调用每个项目显示如下:

<dt class="col-sm-2">
    @Html.DisplayNameFor(model => model.Activity.Single().Status)
</dt>
<dd class="col-sm-10">
    @Html.DisplayFor(model => model.Activity.Single().Status)
</dd>

显然 single 会抛出异常,但我不确定用什么替换它。我想可能是 Where() 或 FindAll() 但在我当前的设置中都不起作用。

【问题讨论】:

  • 因为您使用ActivityTask 进行过滤,即.Include(c=&gt;c.ActivityTask) 可能最终只有一条记录。您是否根据活动检查了后端联系人的确切总记录?
  • 我成功地让单个活动出现,但是当添加任何其他活动时,由于我使用了 single() 而收到错误。我们显示的还有其他几个字段,我在这里复制了一个以供参考。此外,我在其中包含了活动任务,因为它是我想包含在结果中的另一个表中的一条数据。 Activitytask 是活动表上的外键。这有意义吗?
  • Include 不过滤,它只填充导航属性。
  • 请把整个页面显示出来好吗?

标签: c# entity-framework asp.net-core sequence razor-pages


【解决方案1】:

您必须在打开剃刀代码以呈现活动列表之间进行选择:

@foreach (var item in Activity)
{
    <...
}

或使用.FirstOrDefault() 并仅渲染第一个。

问候。

【讨论】:

  • 请注意:Include 在 Left Join 中转译,因此无法过滤您的结果。
猜你喜欢
  • 2022-01-08
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多