首页 > 解决方案 > 使用 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     

PARTS.CAR_ID注意:数据库中的和CARS.ID列之间没有外键关系。


如果没有外键,将使用哪种 linq 查询来获得这些结果:

    CARS
    ID   CAR_MODEL        PART_NAME_LIST
    11   Mustang          Steering Wheel
    22   Camaro           Steering Wheel, Headlights
    33   F-150            (null)

环境:SQL Server 2014,linq-to-sql


编辑:这是我到目前为止所拥有的,但这会导致结果中有 4 行(Camaro 为 2 行),而不是 3 行,并且它不包括任何部分。

from C in db.CARS
join P in db.PARTS on C.ID equals P.CAR_ID
select new{
   ID = C.ID,
   CAR_MODEL = C.CAR_MODEL,
   PART_NAME_LIST = ???
} 

标签: linqlinq-to-sql

解决方案


对于连接字符串,您必须使用string.Join. 最简单的方法是在子查询中:

(
from c in db.CARS
select new
{
   ID = c.ID,
   CAR_MODEL = c.CAR_MODEL,
   PART_NAME_LIST = db.PARTS
                      .Where(p => c.ID equals p.CAR_ID)
                      .Select(p => p.PART_NAME)
}
).AsEnumerable()
.Select(c => new
{
    ID = c.ID,
    CAR_MODEL = c.CAR_MODEL,
    PART_NAME_LIST = string.Join(", ", cPART_NAME_LIST) 
})

实体框架不支持string.Join,因此您必须将查询拆分为 EF 可以转换为 SQL 的部分和在内存中执行的部分,用 . 分隔AsEnumerable()


推荐阅读