You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF搜索方法中如何访问子实体Suspects的Name属性实现过滤

问题分析

你的代码里Suspects是SeizureEntry的子实体集合(比如ICollection<Suspect>),不是单个实体,所以直接访问.Name会编译报错。要实现按嫌疑人名称过滤,得用集合的判断方法检查是否存在匹配的嫌疑人。

修复后的代码

把过滤条件里的嫌疑人名称判断改成用Any()方法,检查集合中是否有任一嫌疑人的名称包含搜索关键词:

public async Task<IActionResult> listSeizureEntries(DatatablesRequest table_req)
{
    table_req.RecordsTotal = _context.SeizureEntry.Count();
    
    var filtered = _context.SeizureEntry.Include(c => c.Suspects).AsQueryable();
    
    if (!String.IsNullOrEmpty(table_req.search.value))
    {
        var searchValue = table_req.search.value;
        filtered = filtered.Where(s => 
            s.Agency.Contains(searchValue) || 
            s.OfficerNameRank.Contains(searchValue) || 
            s.SeizureAddress.Contains(searchValue) || 
            // 核心修改:用Any()遍历嫌疑人集合,检查是否有匹配项
            s.Suspects.Any(suspect => suspect.Name.Contains(searchValue)));
    }

    table_req.RecordsFiltered = filtered.Count();

    var temp = filtered
        .Select(f => new { f.Id, f.EntryId, f.SeizureDate, f.OfficerNameRank, f.Agency, f.SeizureAddress });

    var only_care_about_this = table_req.order[0];
    
    // 补充后续Datatables响应逻辑...
}
额外提示
  1. 空值防护:如果你的Suspects导航属性可能为null(EF Core默认会初始化集合为空而非null,一般不需要),可以加上空判断:s.Suspects != null && s.Suspects.Any(...)
  2. 大小写不敏感搜索:如果需要忽略大小写匹配,可以调整为:
    s.Suspects.Any(suspect => suspect.Name.ToLower().Contains(searchValue.ToLower()))
    
    或者用EF Core的数据库原生函数优化性能:
    s.Suspects.Any(suspect => EF.Functions.Like(suspect.Name, $"%{searchValue}%"))
    

内容的提问来源于stack exchange,提问作者kylecol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:57:16