Преобразование SQL-запроса в LINQ

ЭТОТ ПОЛЬЗОВАТЕЛЬ УЖЕ ЗАПРОСИЛ ТОЧНУЮ ДУБЛИКУ НЕСКОЛЬКО МИНУТ НАЗАД запрос sql и linq< /сильный>

PhotoAlbums таблица
AlbumID
Название
Дата

Photos таблица:
ID фотографии
Название
Дата
ID альбома

SELECT     AlbumID, Title, Date,
                          (SELECT     TOP (1) PhotoID
                            FROM          Photos AS c
                            WHERE      (AlbumID = a.AlbumID)) AS PhotoID
FROM         PhotoAlbums AS a

Мне нужен этот запрос, написанный на LINQ-to-SQL. заранее спасибо


person ilija veselica    schedule 31.03.2010    source источник
comment
возможный дубликат stackoverflow.com/questions/2552190/sql-and-linq-query   -  person Fredou    schedule 31.03.2010
comment
Знаете ли вы, что результат TOP(1) неопределен, если вы не указываете предложение order by? См.: stackoverflow.com/questions/1261625/   -  person Mark Byers    schedule 31.03.2010
comment
ваш запрос неэффективен, так как он должен выполнять другой запрос, чтобы найти фотографию для каждой строки, возвращенной из PhotoAlbums. Вам было бы гораздо лучше использовать производную таблицу и присоединять к ней PhotoAlbums.   -  person KM.    schedule 31.03.2010
comment
@jason: я застрял в самом начале... первая строка выражения в скобках - проблема. В LINQ нет ключевых слов SELECT и TOP.   -  person ilija veselica    schedule 31.03.2010
comment
@ile: В Linq есть select, и вместо TOP (n) вы можете использовать Take(n), хотя в этом примере, поскольку вам нужно только TOP(1), вы можете использовать First.   -  person Mark Byers    schedule 31.03.2010
comment
@Fredou: да, но в конце концов я решил отделить создание SQL-запроса от его перевода в LINQ.   -  person ilija veselica    schedule 31.03.2010
comment
@ Марк: Хм, не знал.   -  person ilija veselica    schedule 31.03.2010
comment
@KM: Я не совсем тебя понимаю .. разве твой запрос не выполняет другой запрос?   -  person ilija veselica    schedule 31.03.2010
comment
@ile, мой запрос запускает один запрос производной таблицы, чтобы найти 1 строку для каждого альбома, а затем объединяет все эти строки, этот запрос запускает отдельный запрос для каждой строки альбома, что на целый порядок медленнее. в sql менее реальный код не означает лучший запрос, а небольшие различия могут привести к огромным различиям в производительности.   -  person KM.    schedule 31.03.2010
comment
Понятно... Я не очень хорошо разбираюсь в SQL, поэтому не знаю, насколько это на самом деле отражается на производительности.   -  person ilija veselica    schedule 31.03.2010
comment
@ile, чем больше строк нужно добавить в PhotoAlbums, тем медленнее будет выполняться ваш запрос. моя версия должна оставаться быстрой. если вы не ожидаете, что у вас будет много строк, не беспокойтесь, но вы должны попытаться изучить различия.   -  person KM.    schedule 31.03.2010


Ответы (2)


Предполагая, что вы определили связь между PhotoAlbums и Photos в файле DBML, вы можете сделать это:

var albums = dataContext.PhotoAlbums.Select(album => new {
    AlbumId = album.AlbumId,
    Title = album.Title
    Date = album.Date,
    PhotoId = album.Photos.Select(photo => photo.PhotoId).FirstOrDefault()
});
person Mark Byers    schedule 31.03.2010

Вы можете сделать это следующим образом:

var result = 
   yourContext.PhotoAlbums.Select(a => 
      new {a.AlbumId, a.Title, a.Date, a.Photos.First().PhotoId }
   );

Кроме того, LinqPad — очень хороший инструмент, который может помочь вам в этом.

person Klaus Byskov Pedersen    schedule 31.03.2010