Используя Linq, как можно объединить две таблицы без отношения внешнего ключа между двумя таблицами? - PullRequest
0 голосов
/ 05 октября 2018

Допустим, у нас есть две таблицы:

    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


edit: вот что у меня пока есть, но в результате получается 4 строки в результатах (2 для Camaro) вместо 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 = ???
} 

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вот свободное соединение группы синтаксиса:

var sub = (from C in db.CARS
          join P in db.PARTS on C.ID equals P.CAR_ID into Pj
          select new {
              C.ID,
              C.CAR_MODEL,
              PART_NAMES = from p in Pj select p.PART_NAME
          })
          .AsEnumerable();
var ans = from icp in sub
          select new {
              icp.ID,
              icp.CAR_MODEL,
              PART_NAME_LIST = String.Join(", ", icp.PART_NAMES)

Я бы, вероятно, переключился на лямбда-синтаксис в select в моем коде:

var ans = (from C in db.CARS
           join P in db.PARTS on C.ID equals P.CAR_ID into Pj
           select new {
               C.ID,
               C.CAR_MODEL,
               PART_NAMES = Pj.Select(cpj => cpj.PART_NAME)
          })
          .AsEnumerable()
          .Select(icp => new {
              icp.ID,
              icp.CAR_MODEL,
              PART_NAME_LIST = String.Join(", ", icp.PART_NAMES)
          });
0 голосов
/ 05 октября 2018

Для объединения строк вы должны использовать 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) 
})

Entity Framework не поддерживает string.Join, поэтому вам нужно разделить запрос на часть, которую EF может преобразовать в SQL, и часть, котораявыполняется в памяти, разделенных AsEnumerable().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...