2011-05-11 4 views
0

지금까지이 문제에 대해 40 시간을 보냈습니다.이 사이트와 Google에서 모든 솔루션을 시도했지만 아직 해결할 수 없습니다.Linq to Entities Left Outer 다른 유형으로 가입하십시오

var에 저장된 이전 쿼리의 결과에 테이블을 조인해야합니다. 결합 필드는 var의 결과에 대해 쿼리 된 테이블의 varchar이고 조인중인 테이블의 bigint (long)입니다. 여기에 "객체 참조가 객체의 인스턴스로 설정되지 않았습니다."라는 현재 시도가 있습니다. 모든 엔터티 오류는 말도 안되는 것처럼 보이고 나에게 거짓말을한다. 나는 그것이 일치한다는 것을 말하려고 노력하고 있다고 가정한다. 그러나 누가 알 수있다.

 List<reportUser> ru = leaders 
     .GroupJoin(db.sweeps, 
     a => a.FBID.ToString(), 
     s => s.userFBID.First().ToString(), 
     (a, matching) => new reportUser 
     { 
      FBID = a.FBID, 
      CurrentPoints = a.CurrentPoints, 
      Name = matching.FirstOrDefault().Name, 
      Email = matching.FirstOrDefault().email 
     } 
     ?? new reportUser 
     { 
      FBID = 0, 
      CurrentPoints = 0, 
      Name = "", 
      Email = "" 
     }) 
     .Select(a => a) 
     .ToList(); 

다음은 요청한 SQL입니다. Leaders 객체를 만들기 위해 SQL을 포함 시켰습니다. 위의 모든 것은 실제로는 왼쪽에있는 마지막 줄입니다. ( 선택 a.userfbid, SUM (a.pointvalue)의 전체적인 c.score

선택 s.name, s.email, b.score, L 왼쪽 ( 선택 userfbid, pointvalue 에서 점수 qa.id = l.qaid에 qa 합치기 q.id = qa.qid에 조인 q가 남았습니다. 왼쪽에 합계 qz.id = q.qzid 여기서 qa.pointvalue> 0 및 qz.cid = 12 합집합 전체 select fbid userfbid, 포인트 값 bn 날짜> = '5/9/2011 04:00'및 날짜 < = '5/16/2011 04 :

B 00 ) a.userfbid 의해 기) ( 선택 a.userfbid, SUM (a.pointvalue) ( 선택 userfbid, L 에서 pointvalue 에서 점수 가입을 왼쪽에 QA 가입 왼쪽 qa.id = l.qaid 이 q.id = qa.qid 에 Q 가입 왼쪽에게 qz.id = q.qzid 에 QZ에 가입했던 곳 억에서 qa.pointvalue> 0 노동 조합의 모든 선택 fbid의 userfbid, pointvalue ) a.userfbid의 그룹c.userfbid = b.userfbid

왼쪽) C는

답변

0

나는 데이터베이스에 s.userFBID.First()가 null 결코 있으리라 믿고있어 점수를 내림차순으로 s.userfbid = b.userfbid 순서에의 가입?

맞아 있다면, 당신의 문제는 FirstOrDefault().Name 유형 문에있을 수 있습니다 - FirstOrDefault()null에 평가할 때 다음 분명히 당신이 NullReferenceException이 얻을 것이다 :/

이 해결하기 위해이 같은 시도 :

List<reportUser> ru = leaders 
     .GroupJoin(db.sweeps, 
     a => a.FBID.ToString(), 
     s => s.userFBID.First().ToString(), 
     (a, matching) => 
     { 
      var match = matching.FirstOrDefault(); 
      return match != null ? 
      new reportUser 
     { 
      FBID = a.FBID, 
      CurrentPoints = a.CurrentPoints, 
      Name = match.Name, 
      Email = match.email 
     } 
     : new reportUser 
     { 
      FBID = 0, // a.FBID ? 
      CurrentPoints = 0, // a.CurrentPoints ? 
      Name = "", 
      Email = "" 
     }}) 
     .Select(a => a) 
     .ToList(); 
을 그러나

, 나는 그것이 약간 하드 데이터베이스의 구조를 보지 않고이 일을 찾을 ... 또는 일부 샘플 데이터


,

일단 작업이 완료되면이 항목을 더 쉽게 이해할 수있는 항목으로 분류 해 보시길 강력히 권장합니다. - 여기에 무슨 일이 일어나고 있는지 잘 모르겠습니다!

+0

올바른지, 리더 데이터의 값과 일치하는 값이 항상 스윕에 있어야합니다. 리더에서 값이없는 스윕에서 값을 가질 수도 있지만 중요하지 않아야합니다. .First() 및 .FirstOrDefault()를 사용하여 시도한 결과 둘 다 오류가 발생합니다. 그 문장을 제거하면, 타입 인자를 추론 할 수 없다는 오류가 발생합니다. – iniquity

+0

내가 원하는 것은 여기 왼쪽 간단한 조인입니다. 이 코드가 왜 필요한지 이해할 수 없습니다. Leaders 변수에 userFBID 필드가 있고 db.Sweeps에 일치하는 필드가 있습니다. 스윕의 이름과 전자 메일을 이미 리더의 데이터와 비교하기 만하면됩니다. 이것은 SQL에서 최대 10 분이지만 엔티티에서는 40 시간이며 간략하게 이해할 수있는이 복잡한 코드와 수정할 수없는 오류가 있습니다. – iniquity

+0

입력 한 코드가 모든 레코드에 대해 0 또는 ""값을 가진 빈 세트를 반환합니다. 나는 그것이 null을 얻었을 경우에만 반환하도록 의도 했으므로 다음 단계는 중단되지 않습니다. 실제로는 null이되지 않습니다. – iniquity

0

여기에 간단한 왼쪽 외부 당신을 위해 가입의 :

var query = from l leaders 
     join s in db.sweeps on l.FBID equals s.userFBID.First() into joined 
     from j in joined.FirstOrDefault() 
     select new reportUser 
    { 
     FBID = l.FBID, 
     CurrentPoints = l.CurrentPoints, 
     Name = j == null ? string.Empty : j.Name, 
     Email = j == null ? string.Empty : j.email 
    } 

를이 없습니다 당신이 ... 어쩌면 당신이 실제로 원하는에 대한 SQL을 게시하려고 찾고있는 매우 것입니다 경우.

+0

마찬가지로 나는 지도자를 다시 선언하게하지 않을 것이다. 나는 당신이 "지도자들로부터"나는 말을하기로했다. 그래서 나는 그것을 덧붙였다. 이제 "joined.FirstOrDefault()"라는 오류 메시지가 나타납니다. "소스 유형이 'System.Collections.Generic.IEnumerable '타입 추론이'SelectMany '호출에 실패했습니다 – iniquity

+0

SQL을 쓰는 데 "10 분"을 소비해야 할 때라고 생각합니다 – Stuart

+0

원래 게시물에 SQL을 추가했습니다. – iniquity

관련 문제