Linq to SQL - вернуть детали записи из двух таблиц - PullRequest
2 голосов
/ 23 февраля 2010

У меня проблемы с запросом linq. Это простая проблема, но я не уверен, как лучше всего к ней подойти. У меня есть две таблицы (я только показываю соответствующие поля) с именами Artist и Song:

ARTIST - int ArtistID (pk)
         varchar Name

SONG - int SongID (pk)
       uniqueidentifier UserID (To lookup songs the user has added to their account)
       int ArtistID (foreign key to ArtistID in Artist table)
       varchar songName

Что я хотел бы сделать, это создать метод в моем DAL, который извлекает все песни пользователя (с учетом идентификатора пользователя) и отображает его в ретрансляторе, который объединяет имя исполнителя с песней (так что конечный результат будет быть ArtistName - songName). Я создал этот запрос:

            var query = from p2 in db.SONG
                        where p2.UserID == givenUserID
                        join p in db.ARTIST
                        on p2.ArtistID equals p.ArtistID
                        select new ArtistSongStruct
                        {
                            ArtistName = p.Name,
                            songName = p2.songName

                        };   

            return query;

Это работает до такой степени, что я могу отлаживать на своем бизнес-уровне и читать правильные значения. Однако ArtistSongStruct - это пользовательская структура, которую я создал в DAL только для этого метода. Я не уверен, что это хороший способ делать вещи. Во-вторых, даже если это возвращается на бизнес-уровень, я не могу заставить повторитель показывать фактические значения. Он отображает ошибку, утверждая, что нет свойства с именем ArtistName/songName.

Каков наилучший способ вернуть исполнителя и его песню на основе ArtistID? Спасибо за любые предложения. Я совсем новичок в L2S, так что это немного сбивает с толку.

Ответы [ 3 ]

2 голосов
/ 23 февраля 2010

Вы не должны возвращать запрос, вы должны как можно скорее закрыть соединение с базой данных и вернуть результат запроса ToList ().

using(DataContext db = new DataContext())
{
        var query = from p2 in db.SONG
                    where p2.UserID == givenUserID
                    join p in db.ARTIST
                    on p2.ArtistID equals p.ArtistID
                    select new ArtistSongStruct
                    {
                        ArtistName = p.Name,
                        songName = p2.songName

                    };   

        return query.ToList();
}

РЕДАКТИРОВАТЬ: Я не уверен, почему вы используете struct рассмотреть возможность использования class, но ваша реальная проблема заключается в том, что у вас есть открытые поля, а не публичные свойства. Reader привязывается только к публичным свойствам, поэтому вы получаете ошибку. Измените свою структуру на.

    public struct ArtistSongStruct 
    {  
       public string ArtistName {get; set;}
       public string songName { get; set; } 
    }
0 голосов
/ 14 октября 2011

Я могу использовать IList в качестве возвращаемого типа метода, а на вызывающей стороне я использую динамический тип, если можно for зациклить результат, и он просто работает как магия.

    public static IList GetHistory(DateTime time, string contact = "")
    {
        using (Entities entities = new Entities())
        {
            //....your code
            return convs.ToList();
        }
    }

Теперь вы можете назвать это как:

        dynamic sa = DataStore.GetHistory(DateTime.Now, "satish");
        foreach (var a in sa)
        {
            Console.WriteLine(a.ConvText);
        }
0 голосов
/ 23 февраля 2010

По какой причине вы не можете вернуть IEnumerable из Strings в отличие от пользовательской структуры?

var query = from p2 in db.SONG
                    where p2.UserID == givenUserID
                    join p in db.ARTIST
                    on p2.ArtistID equals p.ArtistID
                    select String.Format("{0} - {1}", p.Name, p2.songName)  

        return query.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...