2013-10-31 2 views
0

웹 API에 대해이 코드를 작성할 수 있습니다. 이 코드에서는 견인 쿼리를 작성하고 주석과 추종자 데이터를 ctime 및 startsfollowing을 기준으로 시간을 기준으로 병합 (결합하지 않음)하는 방식으로 결합했습니다. 사용자가 새로운 코멘트를 가지고 있다면, 코멘트가 가장 먼저오고, 추종자가 첫 번째라면, 추종자 데이터가 먼저 와야합니다.linq 쿼리를 사용하는 동안 런타임 오류

public IQueryable<Object> GetCommentsandFollowActivityCommnets() 
    { 

     var combo1 = from c in db.comments 
        join p in db.picturedetails on c.targetpictureid equals p.idpictures 
        join u in db.users on c.iduser equals u.iduser 
        select new TCommentDTO 
        { 

         idcomments=c.idcomments, 
         comment1 = c.comment1, 
         targetpictureid = c.targetpictureid, 
         ctime = c.ctime, 
         iduofpic=p.iduser, 
         iduofcommentor=c.iduser, 
         profilepicofcommentor=u.profilepic, 
         usernameofcommentor=u.username, 
         picFilename=p.picFilename, 
         picTitle=p.picTitle 

        }; 

     var combo2= from f in db.followers 
        join u in db.users on f.iduser equals u.iduser 
        select new TfollowerDTO 
        {  
         idfollowers=f.idfollowers, 
         iduser=f.iduser, 
         targetiduser=f.targetiduser, 
         startedfollowing=f.startedfollowing, 
         unoffollower=u.username, 
         ppoffollower=u.profilepic, 
         status=u.status 


        }; 
      var result1 = from c in combo1 
      select new UserTimeLineDTO 
      { SortKey = c.ctime, Member =c}; 

      var result2 = from c in combo2 
      select new UserTimeLineDTO{ SortKey = c.startedfollowing, Member = c }; 

      var result = result1.Concat(result2).OrderBy(x =>x.SortKey).Select(x => x.Member); 

      return result; 

    } 

코드가 컴파일 타임 오류를 나타내지 않습니다. 그것은 컴파일러에서 잘 실행되지만 런타임에 예외가 발생합니다 :

DbUnionAllExpression requires arguments with compatible collection ResultTypes. 

이 예외를 제거하는 방법?

답변

1

이 문제를 해결 I 메모리에 마지막 표현식을 평가하려고 할 것이다 :

 var result1 = (from c in combo1 
     select new UserTimeLineDTO 
     { SortKey = c.ctime, Member =c}).ToList(); 

     var result2 = (from c in combo2 
     select new UserTimeLineDTO{ SortKey = c.startedfollowing, Member = c }).ToList(); 

     var result = result1.Concat(result2).OrderBy(x =>x.SortKey).Select(x => x.Member); 

노조가 지금의 성공뿐만 아니라 주문 및 최종 투사한다.

+0

작동 원리, 이유를 설명해주세요. – Obvious

+1

.ToList는 평가를 강제 실행하고 객체를 메모리에 구체화합니다. 이 방법으로 Concat은 데이터베이스 측이 아닌 메모리에서 평가됩니다. –

관련 문제