2012-03-29 56 views
1

我想翻譯下面這個簡單的SQL查詢到的LINQ to NHibernate的:條件的行數不工作

SELECT NewsId 
    ,sum(n.UserHits) as 'HitsNumber' 
    ,sum(CASE WHEN n.UserHits > 0 THEN 1 ELSE 0 END) as 'VisitorsNumber' 
FROM UserNews n 
GROUP BY n.NewsId 

我簡化UserNews類:

public class AktualnosciUzytkownik 
{ 
    public virtual int UserNewsId { get; set; } 
    public virtual int UserHits { get; set; }   
    public virtual User User { get; set; } // UserId key in db table 
    public virtual News News { get; set; } // NewsId key in db table 
} 

我寫以下linq查詢:

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代碼(我仍然不知道如何做到這一點在LINQ to NHibernate的):

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>(); 

它產生下面的TSQL:

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其中