Моя первая попытка ниже, ниже, Но полученный 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