Как сгладить вложенную сущность, используя LINQ (противоположный Selectmany)?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как сгладить вложенную сущность, используя LINQ (противоположный Selectmany)?

Сообщение Anonymous »

Я пытаюсь преобразовать SQL в LINQ, который вытягивает две связанные таблицы в одну запись на родительскую строку таблицы (противоположность Selectmany ).
Моя первая попытка ниже, ниже, Но полученный SQL отличается, хотя результат одинаков. В примере используется Product и productimage , где один продукт может иметь несколько ProductMages .
- это правильно, а 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
< /code>
Первая попытка LINQ преобразовать этот запрос: < /p>
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 вместо приведенного выше, что выглядит менее эффективным (примечание: фактическое количество выполнений для приведенного ниже SQL составляет почти половину от исходного 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 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как сгладить вложенную сущность с помощью Linq (в отличие от SelectMany)?
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как сгладить вложенный объект с помощью Linq (в отличие от SelectMany)?
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как сгладить вложенный объект с помощью Linq (в отличие от SelectMany)?
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как сделать эквивалент LINQ SelectMany() только в JavaScript
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

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