2010-02-23 65 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); 
     } 
相关问题