C# 将SQL查询转换为NHibernate查询
我有这两张桌子 AppUser 主键:用户标识 用户原则C# 将SQL查询转换为NHibernate查询,c#,sql,sql-server,nhibernate,paging,C#,Sql,Sql Server,Nhibernate,Paging,我有这两张桌子 AppUser 主键:用户标识 用户原则 public UserPagedQuery(ISessionProvider<ISession> sessionProvider) { _sessionProvider = sessionProvider; _query = sessionProvider.Session.QueryOver<IUser>(); var uc = _query.UnderlyingCriteria;
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;
}
用户ID(不是此表中的键)
用户名
我需要在NHibernate中使用分页进行此查询:
我现在的相关代码是:
(IUser代表的AppUser;StoredCredentials代表的UserPrinciples)
这还不够好,因为我只需要每个用户id中的一条记录,对于某些用户,通过这个查询我可以获得多条记录,这就是问题所在
有人能帮忙吗?
不确定是否需要任何其他细节
感谢并向您致以最诚挚的问候表示为不带分区的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();
var y=来自会话中的up1.Query()
按up1将up1分组。将名称放入g中
在f中选择新的{Name=g.Key,UserId=g.Min(x=>x.Company.Id)}
在新{f.Name,f.UserId}上的session.Query()中加入up2等于新{up2.Name,UserId=up2.Company.Id}
选择要添加的新内容
{
ProfileName=up2.Name,
UserId=up2.User.Id,
Name=up2.User.Name,
};
var结果=y.ToList();
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
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();