2012-03-29 4 views
1

작동하지 않습니다 다음 LINQ 쿼리 :조건부 행 개수 내가 NHibernate에 Linq에로 간단한 SQL 쿼리 다음 번역 할

var hitsPerNews = (from n in Session.Query<UserNews>() 
        group n by n.News.NewsId into g 
        select new { NewsId = g.Key, HitsNumber = g.Sum(x => x.UserHits), 
        VisitorsNumber = g.Count(x => x.UserHits > 0) }).ToList(); 

그러나 생성 된 SQL 내 x => x.UserHits > 0 문을 무시 불필요한 '왼쪽 외부 결합'을 만듭니다.

SELECT news1_.NewsId    AS col_0_0_, 
     CAST(SUM(news0_.UserHits) AS INT) AS col_1_0_, 
     CAST(COUNT(*) AS    INT) AS col_2_0_ 
FROM  UserNews news0_ 
     LEFT OUTER JOIN News news1_ 
     ON  news0_.NewsId=news1_.NewsId 
GROUP BY news1_.NewsId 

어떻게 해결할 수 있습니까? QueryOver 구문을 사용하면 더 효과적 일 수 있습니까?

나는 마침내 내 질문에 대한 답을 찾을

답변

1

은, 내 솔루션은 this question에 대한 답변을 기반으로합니다

내 QueryOver 코드 (난 아직도 NHibernate에 Linq에 그것을 할 방법을 모른다) :

UserHitsDto adDtoAlias = null; 

var userHits = Session.QueryOver<UserNews>() 
    .Select(Projections.Group<UserNews>(c => c.News.NewsId) 
            .WithAlias(() => adDtoAlias.NewsId), 
      Projections.Sum<UserNews>(x => x.UserHits) 
            .WithAlias(() => adDtoAlias.HitsNumber), 
      Projections.Sum(Projections.Conditional(
       Restrictions.Where<UserNews>(f => f.UserHits > 0), 
       Projections.Constant(1), 
       Projections.Constant(0) 
      )).WithAlias(() => adDtoAlias.VisitorsNumber) 
      ) 
    .TransformUsing(Transformers.AliasToBean<UserHitsDto>()) 
    .List<UserHitsDto>(); 

SELECT this_.NewsId AS y0_, 
     SUM(this_.UserHits) AS y1_, 
     SUM((
     CASE 
        WHEN this_.UserHits > @p0 
        THEN @p1 
        ELSE @p2 
     END)) AS y2_ 
FROM  UserNews this_ 
GROUP BY this_.NewsId 

@p0 = 0, @p1 = 1, @p2 = 0

:

그것은 다음 TSQL을 생산