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
相关产品推荐
相关产品推荐

