2012-11-21 1 views
0

데이터베이스에 질의 응답 테이블이 있습니다. Join을 사용하여 답변으로 질문을 선택하고 LINQ로 질문과 답변을 얻으려고했습니다. 여기 내 코드는 다음과 같습니다.고유 한 Linq 선택

같은 질문 (Id)을 가진 많은 행이 있습니다. 그것은 모든 것을 반복합니다. 한 번만 질문을 반복해야합니다. 7 개의 질문이 있고 모든 질문에 4 개의 대답이있는 경우이 코드는 28이라는 개수의 목록을 제공합니다. 그 수는 7이어야합니다. 누구든지 도와 줄 수 있습니까?

public class Question 
{ 
    private Guid oid; 

    public Guid Oid 
    { 
     get { return oid; } 
     set { oid = value; } 
    } 

    private string questionContext; 

    public string QuestionContext 
    { 
     get { return questionContext; } 
     set { questionContext = value; } 
    } 

    private int priority; 

    public int Priority 
    { 
     get { return priority; } 
     set { priority = value; } 
    } 

    private Guid subject; 

    public Guid Subject 
    { 
     get { return subject; } 
     set { subject = value; } 
    } 

    private List<Answer> answers; 

    public List<Answer> Answers 
    { 
     get { return answers; } 
     set { answers = value; } 
    } 

    private int order; 

    public int Order 
    { 
     get { return order; } 
     set { order = value; } 
    } 
} 

public class Answer 
{ 
    private Guid oid; 

    public Guid Oid 
    { 
     get { return oid; } 
     set { oid = value; } 
    } 

    private string answerContext; 

    public string AnswerContext 
    { 
     get { return answerContext; } 
     set { answerContext = value; } 
    } 

    private bool isCorrect; 

    public bool IsCorrect 
    { 
     get { return isCorrect; } 
     set { isCorrect = value; } 
    }  
} 
+0

을 위해 전체 테이블을 열거 할 필요가 없습니다 생각 그렇다면 각 질문에 대한 첫 번째 대답을 원하십니까? 일부 사용자 지정 논리, 무작위 응답을 기반으로 한 특정 응답을 원하십니까? 모든 응답을 목록에 집계하거나 다른 유형의 결합 구조를 원하십니까? – Servy

+0

모든 사람이 Northwind와 비슷한 데이터베이스에 대해이 쿼리를 수행해보십시오. 그것은 사람들이 당신이보고있는 것과 그들이 잘못 가고있는 부분을 이해하는 데 도움이되며, 당신도 이해하는데 도움이 될 것입니다. – Mario

+0

질문은 PK입니까? –

답변

2

난 그냥 .GroupBy을 (N => n.Oid)를 사용하여 질문

(나는 그것이 GUID입니다 각 질문은 고유 OID를 가지고 있다는 가정을했습니다) 그룹화 할 생각
var questions = (from q in dt.AsEnumerable() 
       where (q.Field<Guid>("Question") != null)) 
       select new Question 
       { 
        Oid = q.Field<Guid>("Question"), 
        QuestionContext = q.Field<String>("QuestionContext"), 
        Priority = q.Field<Int32>("Priority"), 
        Order = q.Field<Int32>("OrderQuestion"), 
        Subject = q.Field<Guid>("Subject"), 
        Answers = (from a in dt.AsEnumerable() 
           where a.Field<Guid>("Question") == q.Field<Guid>("Question") 
           select new Answer 
           { 
            Oid = a.Field<Guid>("AnswerOid"), 
            AnswerContext = a.Field<String>("Answer"), 
            IsCorrect = a.Field<bool>("Correct") 
           }).ToList() 
       }).GroupBy(n=>n.Oid).ToList(); 

평평한 컬렉션을 반환하지 않습니다. 구조를 올바르게 이해하면 응답에 7 가지 고유 질문이 표시됩니다. 다른 사람들에 대해 신경 쓰지 않는다면 첫 번째 대답을 얻음으로써이 컬렉션을 평평하게 만들 수 있습니다. 당신은에 대한 GROUPBY (N => n.Oid)이를 추가합니다 :

GroupBy(n=>n.Oid).Select(g => g.First()).ToList(); 
+2

오른쪽으로 스크롤하지 않고 코드를 볼 수 있습니다. 더 많은 공백을 추가해야합니다 :) –

2

내가 먼저 그룹화하는 경우, 다음 각 질문에

List<Question> questions = 
    (from q in dt.AsEnumerable() 
    where (q.Field<Guid>("Question") != null) 
    group q by new { Oid = q.Field<Guid>("Question"), 
         QuestionContext = q.Field<String>("QuestionContext"), 
         Priority = q.Field<Int32>("Priority"), 
         Order = q.Field<Int32>("OrderQuestion"), 
         Subject = q.Field<Guid>("Subject") 
    } into g 
    select new Question { 
     Oid = g.Key.Oid, 
     QuestionContext = g.Key.QuestionContext, 
     Priority = g.Key.Priority, 
     Order = g.Key.Order, 
     Subject = g.Key.Subject, 
     Answers = g.Select(a => new Answer() 
     { 
      Oid = a.Field<Guid>("AnswerOid"), 
      AnswerContext = a.Field<String>("Answer"), 
      IsCorrect = a.Field<bool>("Correct") 
     }).ToList() 
    }).ToList();