您如何使用 linq 有选择地加入表?

How do you selectively join in tables with linq?

假设您有这两个表:

CARS
ID   CAR_MODEL 
11   Mustang          
22   Camaro           
33   F-150     

PARTS
ID   CAR_ID  PART_NAME       
1    11      Steering Wheel  
2    22      Steering Wheel 
3    22      Headlights

您需要创建一个搜索表单。你会如何完成这项工作:

var query = db.CARS.include(u => u.PARTS);

if(model.CarPartName != "")
   query = query.where(u => u.PARTS.PART_NAME == model.CarPartName); //this doesn't work

return query.ToList();

目前 PARTS.CAR_IDCARS.ID 之间存在外键关系,但由于某些原因,当我尝试 u.PARTS 时。我无法附加列名。

知道如何使这个可选的加入起作用吗?

那是行不通的,因为汽车可以有很多零件,因此 u.PARTS 返回的是一个集合。这个问题有很多解决方案,你可以从 Cars 集合开始(就像你做的那样),或者你可以从 PARTS 集合开始。如果您从 PARTS 系列开始,它看起来像:

var query = db.PARTS.Include(p => p.Car);

if(model.CarPartName != "")
   query = query.Where(u => u.PART_NAME == model.CarPartName); 

return query.Select(p => p.Car).Distinct().ToList();

有车:

var query = db.CARS.include(u => u.PARTS);

if(model.CarPartName != "")
   query = query.Where(u => u.PARTS.Any( up => up.PART_NAME == model.CarPartName)); 

return query.ToList();

注意:我添加了第一个,只是因为我想展示发生了什么。