Как сгладить вложенный объект с помощью Linq (в отличие от SelectMany)?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как сгладить вложенный объект с помощью Linq (в отличие от SelectMany)?

Сообщение Anonymous »

Я пытаюсь преобразовать SQL в Linq, который объединяет две связанные таблицы в одну запись для каждой строки родительской таблицы (в отличие от SelectMany).
Моя первая попытка приведена ниже: но результирующий SQL отличается, хотя результат тот же. В примере используются Product и ProductImage, где один Product может иметь несколько ProductImage.
Правильен ли мой Ling и создан ли SQL? эквивалентно, или что Linq может создать SQL ниже?
Таблицы:
  • Product (productid int, name varchar(50))
  • ProductImage (productid int, imageid int, imagepath varchar(450))

    ProductImage.productid — это внешний ключ, указывающий на продукт.
  • ProductImage.imageid имеет номер 1,2,3,4 для каждого изображения продукта

Выбор SQL для выравнивания первых трех фотографий продукта
select
p.productid, p.name,
i1.imagepath as i1imagepath,
i2.imagepath as i2imagepath,
i3.imagepath as i3imagepath
from
product as p
join
productimage as i1 on p.productid = i1.productid
join
productimage as i2 on p.productid = i2.productid
join
productimage as i3 on p.productid = i3.productid
where
i1.imageid = 1 and
i2.imageid = 2 and
i3.imageid = 3

Первая попытка Linq преобразовать этот запрос:
Product.Select( p => new { p.productid, p.name,
i1imagepath = p.ProductImage.AsQueryable()
.Where(i => i.imageid == 1)
.Select(i => i.imagepath).FirstOrDefault(),
i2imagepath = p.ProductImage.AsQueryable()
.Where(i => i.imageid == 2)
.Select(i => i.imagepath).FirstOrDefault(),
i3imagepath = p.ProductImage.AsQueryable()
.Where(i => i.imageid == 3)
.Select(i => i.imagepath).FirstOrDefault()
}).Take(1).Dump(); // LinqPad Dump()

но он выдает этот SQL вместо приведенного выше, что выглядит менее эффективным:
select top 1 p.productid, p.name,
(select top 1 p0.imagepath
from productimage as p0
where p.productid = p0.productid and
p0.imageid = 1) as i1imagepath,
(select top 1 p1.imagepath
from productimage as p1
where p.productid = p1.productid and
p1.imageid = 2) as i2imagepath,
(select top 1 p2.imagepath
from productimage as p2
where p.productid = p2.productid and
p2.imageid = 3) as i3imagepath
from product


Подробнее здесь: https://stackoverflow.com/questions/793 ... selectmany
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как сгладить вложенный объект с помощью Linq (в отличие от SelectMany)?
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как сгладить вложенную сущность с помощью Linq (в отличие от SelectMany)?
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как сгладить вложенную сущность с помощью Linq (в отличие от SelectMany)?
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как сгладить вложенную сущность, используя LINQ (противоположный Selectmany)?
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Как сделать эквивалент LINQ SelectMany() только в JavaScript
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»