2011-05-03 6 views
0

누군가 가이 linq 쿼리와 나를 도울 수있다, 기본적으로 모든 선수는 등급 테이블에 관계없이 쿼리에 반환 된 싶습니다. 그들은 쿼리에 등급이 표시됩니다. 이 쿼리의 문제점은 판사 x가 플레이어 a의 등급을 입력 한 다음 판사 y를 쿼리하면 결과에서 플레이어 a를 얻지 못할 것입니다. 나는 이유를 이해하지만 구문을 이해할 수 있다고 생각합니다.Linq 왼쪽 가입에 대한 도움말

var players = 
     from p in dc.Players 
     join r in dc.Ratings on p.PlayerId equals r.PlayerId into ps 
     from r in ps.DefaultIfEmpty() 
     where r.JudgeId == Convert.ToInt32(JudgeId) || r.JudgeId == null 
     orderby p.PlayerName 
     select new 
     { 
      PlayerName = p.PlayerName, 
      PlayerId = p.PlayerId, 
      Passing = r != null ? r.Passing : 0, 
      Setting = r != null ? r.Setting : 0, 
      Serving = r != null ? r.Serving : 0, 
      Blocking = r != null ? r.Blocking : 0, 
      Effort = r != null ? r.Effort : 0, 
      Quickness = r != null ? r.Quickness : 0, 
      Hitting = r != null ? r.Hitting : 0, 
      PositionKnowledge = r != null ? r.PositionKnowledge : 0, 
      Total = r != null ? Convert.ToString(r.Passing + r.Setting + r.Serving + r.Blocking + r.Effort + r.Quickness + r.Hitting + r.PositionKnowledge): "You have not rated this person", 
     }; 

답변

1

난 그냥이 대신하도록 조인으로 where 절을 이동해야 믿습니다

는 "나에게 모든 플레이어를주고, 그들이 가지고있는 등급은 다음 판사가되지 않은 평가를 필터링 나에게 모든 선수주세요 "

당신이

얻을"어떤 평가가 판사 a로 있습니다. "

var players = 
    from p in dc.Players 
    join r in dc.Ratings on p.PlayerId equals r.PlayerId && r.JudgeId == Convert.ToInt32(JudgeId) into ps 
    from r in ps.DefaultIfEmpty() 
    orderby p.PlayerName 
    select new 
    { 
     PlayerName = p.PlayerName, 
     PlayerId = p.PlayerId, 
     Passing = r != null ? r.Passing : 0, 
     Setting = r != null ? r.Setting : 0, 
     Serving = r != null ? r.Serving : 0, 
     Blocking = r != null ? r.Blocking : 0, 
     Effort = r != null ? r.Effort : 0, 
     Quickness = r != null ? r.Quickness : 0, 
     Hitting = r != null ? r.Hitting : 0, 
     PositionKnowledge = r != null ? r.PositionKnowledge : 0, 
     Total = r != null ? Convert.ToString(r.Passing + r.Setting + r.Serving + r.Blocking + r.Effort + r.Quickness + r.Hitting + r.PositionKnowledge): "You have not rated this person", 
    }; 
2

마이클이 올바른 생각을 갖고 있습니다. 나는 LINQPad에서 일하고 있었고 여러 조건에 참여하는 구문이 & & 연산자를 사용하는 것보다 조금 더 복잡하다는 것을 알았습니다.

var judgeId = Convert.ToInt32(JudgeId); // Can't do this inside the anonymous type declartion, so do it first 
var players = 
     from p in dc.Players 
     join r in dc.Ratings on new {p.PlayerId, JudgeId = judgeId } equals new {r.PlayerId, r.JudgeId} into ps 
     from r in ps.DefaultIfEmpty() 
     orderby p.PlayerName 
     select new 
     { 
      PlayerName = p.PlayerName, 
      PlayerId = p.PlayerId, 
      Passing = r != null ? r.Passing : 0, 
      Setting = r != null ? r.Setting : 0, 
      Serving = r != null ? r.Serving : 0, 
      Blocking = r != null ? r.Blocking : 0, 
      Effort = r != null ? r.Effort : 0, 
      Quickness = r != null ? r.Quickness : 0, 
      Hitting = r != null ? r.Hitting : 0, 
      PositionKnowledge = r != null ? r.PositionKnowledge : 0, 
      Total = r != null ? Convert.ToString(r.Passing + r.Setting + r.Serving + r.Blocking + r.Effort + r.Quickness + r.Hitting + r.PositionKnowledge): "You have not rated this person", 
     }; 
1

두 가지 제안은 Visual Studio에서 컴파일 오류가 발생하지 않았고 컴파일 오류가 발생했습니다. 그러나 그들은 아이디어를 촉발 시켰고 이것은 효과가있는 것으로 보인다.

int judgeId = Convert.ToInt32(Session["logged"]); 
     var filtered = from r in dc.Ratings 
         where r.JudgeId == judgeId 
         select r; 
     var players = from p in dc.Players join 
         r in filtered on p.PlayerId equals r.PlayerId 
         into ps from r in ps.DefaultIfEmpty() 
         orderby p.PlayerName 
         select new { PlayerName = p.PlayerName, PlayerId = p.PlayerId, Passing = r != null ? r.Passing : 0, Setting = r != null ? r.Setting : 0, Serving = r != null ? r.Serving : 0, Blocking = r != null ? r.Blocking : 0, Effort = r != null ? r.Effort : 0, Quickness = r != null ? r.Quickness : 0, Hitting = r != null ? r.Hitting : 0, PositionKnowledge = r != null ? r.PositionKnowledge : 0, Total = r != null ? Convert.ToString(r.Passing + r.Setting + r.Serving + r.Blocking + r.Effort + r.Quickness + r.Hitting + r.PositionKnowledge) : "You have not rated this person", }; 
+0

정말 혼란 스럽습니다. 어제 LINQPad에서 작동한다는 것을 알았지 만, 그것을 복사하고 붙여 넣는 것은 그렇지 않습니다. 미안합니다! –

+0

아, 나는 그것이 무엇인지에 관해 안다. 내 변수 이름 var judgeId가 Convert 호출을 포함하는 늦은 편집이었습니다. 다시 답변을 드리겠습니다. 그러나이 대안을 찾은 것을 기쁘게 생각합니다. –