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

时间:2018-10-15 17:37:42

标签: linq linq-to-entities

假设您有以下两个表:

data claims;
  length claim $50;
  list = '18430109646000104331929350001,064380958490001,974317618110001,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.';
  cnt=1;
  claim=scan(list,cnt,'.,');
  do while (claim ne '');
    output;
    cnt=cnt+1;
    claim=scan(list,cnt,'.,');
  end;
  keep claim;
run;

您需要创建一个搜索表单。您将如何进行这项工作:

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_ID之间当前存在外键关系,但是由于某种原因,当我尝试使用u.PARTS时。我无法在列名称上追加。

有什么主意如何使此可选联接起作用?

1 个答案:

答案 0 :(得分:1)

那样行不通,因为汽车可以有很多零件,因此u.PARTS返回一个集合。有许多解决此问题的方法,您可以从汽车收藏开始(如您所做的那样),也可以从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();

注意:我添加了第一个,只是因为我想显示正在发生的事情。