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

EF Core LINQ多表关联动态筛选查询结果异常求助

问题排查

你的代码有两个核心问题导致拿不到预期结果:

  • 查询最终只选择了连接表ModeliRadnjas的实体对象,没有投影你需要的Radnja.Grad、Radnja.Naziv_radnje、Modeli.Naziv_modela、Dijelovi.Naziv、Dijelovi.Cijena字段,视图无法获取目标数据。
  • 过滤条件写了大量冗余的else if分支,且依赖延迟加载的导航属性做过滤,如果没开启延迟加载、也没预先加载关联数据,会出现关联对象为null的报错,或者过滤逻辑失效。
修正后代码
public async Task<IActionResult> trazi(string grad, string model, string dio)
{
    // 直接投影需要的字段,无需返回全量连接表数据
    var query = from veza in db.ModeliRadnjas
                join dijelovi in db.Dijelovis on veza.IdDijela equals dijelovi.IdDijela
                join radnja in db.Radnjas on veza.IdRadnje equals radnja.IdRadnje
                join auto in db.Modelis on veza.IdModela equals auto.IdModela
                select new 
                {
                    Grad = radnja.Grad,
                    NazivRadnje = radnja.Naziv_radnje,
                    NazivModela = auto.Naziv_modela,
                    NazivDijela = dijelovi.Naziv,
                    Cijena = dijelovi.Cijena
                };

    // 按参数非空逻辑叠加过滤条件,删除冗余分支
    if (!string.IsNullOrEmpty(grad))
        query = query.Where(x => x.Grad == grad);
    if (!string.IsNullOrEmpty(model))
        query = query.Where(x => x.NazivModela == model);
    if (!string.IsNullOrEmpty(dio))
        query = query.Where(x => x.NazivDijela == dio);

    return View(await query.ToListAsync());
}
补充说明
  • 如果视图是强类型绑定,建议替换上面的匿名类型为自定义的查询结果ViewModel,避免动态类型渲染异常。
  • 如果需要做模糊匹配,可以把等值判断替换为EF.Functions.Like()实现对应逻辑。
  • 要是已经给ModeliRadnjas配置好了指向另外三张表的导航属性,可以删掉手动join语句,直接通过导航属性取字段、写过滤,代码会更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:19:06