【问题标题】:Transforming SQL query to NHibernate query将 SQL 查询转换为 NHibernate 查询
【发布时间】:2014-10-05 14:17:52
【问题描述】:

我有这两张桌子

应用用户

PK:用户 ID

用户原则

User_ID(不是此表中的键)

用户名

我需要在 NHibernate 中使用分页进行此查询:

SELECT TOP(page_size)
FROM AppUser this_ left join
 (select UserPrinciples.*
 from  (select UserPrinciples.*,
         row_number() over (partition by UserName order by User_Id) as seqnum
        from UserPrinciples
        ) UserPrinciples
 where seqnum = 1) as b 

 on this_.User_Id=b.User_ID 

我现在的相关代码是:

AppUser 由 IUser 代表;UserPrinciples 由 StoredCredentials 代表

public UserPagedQuery(ISessionProvider<ISession> sessionProvider)
{
    _sessionProvider = sessionProvider;
    _query = sessionProvider.Session.QueryOver<IUser>();

    var uc = _query.UnderlyingCriteria;
    var ap = uc.GetOrCreateAssociationPath("StoredCredentials");
    ap.AddOrder(Order.Asc("UserName"));
}

public IEnumerable<IUser> Execute()
{
    var pagedReceiving = _query.TransformUsing(Transformers.DistinctRootEntity).List<IUser>();
    return pagedReceiving;
}

但是这段代码会返回类似这样的查询~:

SELECT TOP(page_size) FROM AppUser left outer join UserPrinciples 
on AppUser.User_Id=UserPrinciples.User_ID 
ORDER BY UserPrinciples.UserName asc

这还不够好,因为我只需要每个 user_id 中的一条记录,并且通过此查询,对于某些用户,我可以获得多条记录,这就是问题所在。

有人可以帮忙吗? 不知道是否需要任何其他细节

感谢和问候

【问题讨论】:

    标签: c# sql sql-server nhibernate paging


    【解决方案1】:

    表示为没有分区的sql

    SELECT TOP(page_size) up.*, au.* from
      (SELECT UserName, Min(User_Id) as User_Id FROM UserPrinciples GROUP BY UserName) as x
    LEFT JOIN
      UserPrinciples up ON x.UserName = up.UserName AND x.User_Id = up.User_Id
    LEFT JOIN
      AppUser au ON  au.User_Id = up.User_Id
    

    翻译成 linq 应该是这样的:

    var y = from up1 in session.Query<Employment>()
            group up1 by up1.Name into g
            select new { Name = g.Key, UserId = g.Min(x => x.Company.Id) } into f
            join up2 in session.Query<Employment>() on new { f.Name, f.UserId } equals new { up2.Name, UserId = up2.Company.Id }
            select new SomeDto
            {
                ProfileName = up2.Name,
                UserId = up2.User.Id,
                Name = up2.User.Name,
            };
    
    var results = y.ToList();
    

    【讨论】:

      猜你喜欢
      • 2020-11-12
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 2015-10-10
      • 2015-05-08
      • 1970-01-01
      相关资源
      最近更新 更多