2010-02-23 76 views
2

我在linq查詢中遇到了一些麻煩。這是一個簡單的問題,但我不確定接近它的最佳方式是什麼。我有兩個表叫ArtistSong(我只顯示相關字段):Linq to SQL - 從兩個表中返回記錄詳細信息

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其中檢索所有用戶的歌曲的方法(給定UserID),並將其顯示在一個將歌手姓名與歌曲相結合的轉發器中(因此最終輸出將爲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相當陌生,所以這有點混亂。

回答

2

您不應該返回查詢,您應該儘快關閉與數據庫的連接並返回查詢的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,但真正的問題是,因爲你有公共領域,而不是公共屬性。讀者只能綁定到公共屬性,因此你得到的錯誤。改變你的結構。

public struct ArtistSongStruct 
    { 
     public string ArtistName {get; set;} 
     public string songName { get; set; } 
    } 
+0

+1的記憶ToList() – 2010-02-23 18:31:56

+0

感謝您的快速回復。我試圖返回一個ToList(),但重複器會拋出一個錯誤,說'DataBinding:'MyProj.DAL + ArtistSongStruct'不包含名爲'ArtistName'的屬性(我的中繼器代碼是<%#DataBinder .Eval(Container.DataItem,「ArtistName」)%>' – XSL 2010-02-23 18:39:00

+0

我應該添加,我的DAL中的方法是: 'public static List GetUserLinks(Guid cUser)' – XSL 2010-02-23 18:39:57

0

任何原因你不能返回一個IEnumerable的字符串,而不是一個自定義的結構?

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(); 
0

我可以使用的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); 
     } 
相關問題