Linq-to-SQL выбрать много столбцов - PullRequest
2 голосов
/ 28 ноября 2011

Я использую Linq-to-SQL, и я только начал изучать некоторые основы.У меня проблема с командой выбора много столбцов во многих таблицах.Я даю песни, которые были выбраны в сессию (содержат songid), и отображаю имя песни, имя исполнителя, имя жанра в сетке данных.

Но это не работает.

ArrayList SelectedSongs = (ArrayList)Session["SelectedSongs"];

string songIds = "";

foreach (int id in SelectedSongs)
            songIds += id + ", ";

var query = from s in sa.Songs
            from ar in sa.Artists
            from g in sa.Genres
            where s.SongID in (songIds)
            select new { s.SongID, s.SongName, ar.ArtistName, g.GenreName };

dgSongs.DataSource = query;

Может кто-нибудь помочь мне решить эту проблему.Спасибо.

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Этот синтаксис неверен. Linq:

where s.SongID in (songIds)

Линк-эквивалент SQL WHERE IN должен использовать Contains(). Вы должны перевернуть утверждение и начать со списка:

where songIds.Contains(s.SongID)

При использовании Linq-to-SQL вы всегда должны использовать свойства навигации вместо явных объединений. Если у вас есть правильные внешние ключи между вашими таблицами, эти свойства будут созданы автоматически. Со свойствами навигации и songIDs, измененным на int[], ваш запрос должен выглядеть примерно так:

int[] songIDs = ((ArrayList)Session["SelectedSongs"]).OfType<int>().ToArray();

var query = from s in sa.Songs
            where songIDs.Contains(s.SongID)
            select new 
            { 
              s.SongID, 
              s.SongName, 
              s.Artist.ArtistName, 
              s.Genre.GenreName 
            };
0 голосов
/ 28 ноября 2011

Полагаю, вы хотите, чтобы songIds был int [], а не CSV ID.

0 голосов
/ 28 ноября 2011

Похоже, вы пытаетесь присоединиться к нескольким таблицам. Я бы рекомендовал взглянуть на раздел присоединения этой страницы . Удачи!

...