2010-02-23 2 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의 방법을 만드는 것입니다 사용자 ID)를 선택하고 아티스트 이름과 노래를 결합한 중계기에 표시합니다 (최종 출력은 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 인 속성이 없다는 오류를 표시합니다.

아티스트 ID를 기반으로 아티스트와 곡을 반환하는 가장 좋은 방법은 무엇입니까? 제안 해 주셔서 감사합니다. 나는 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(); 
} 

편집합니다 class를 사용하는 것이 당신이 struct를 사용하는 이유는 잘 모르겠지만, 당신이 public 필드가 아닌 공용 속성을 가지고 있기 때문에 당신이 진짜 문제입니다. 리더는 공용 속성에만 바인딩되므로 오류가 발생합니다. 구조체를로 변경하십시오.

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

일을 ToList을 기억하기위한 빠른 응답()에 –

+0

감사합니다. ToList()를 반환하려고 시도했지만 리피터가 'DataBinding :'MyProj.DAL + ArtistSongStruct '에'ArtistName ''이라는 이름의 속성이 포함되어 있지 않다는 오류가 발생합니다 (내 repeater 코드는'<% # DataBinder .Eval (Container.DataItem, "ArtistName 순") %> ' – XSL

+0

나는 내 DAL 내 방법은, 추가해야합니다 : '공공 정적 목록 GetUserLinks (GUID cUser)' – XSL

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에 사용할 수 있습니다.

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); 
     }