NHibernate 3.2 Linq与相关子查询 [英] NHibernate 3.2 Linq with correlated subquery
本文介绍了NHibernate 3.2 Linq与相关子查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有人可以尝试在Linq到NHibernate 3.2中执行以下SQL吗?
Can anyone help with trying to do the following SQL in Linq to NHibernate 3.2?
select act.Name from Activity act
where 1 =
(
select top 1 p.Allow
from Permissions p inner join Operations o on p.OperationId = o.OperationId
inner join Users u on p.UserId = u.UserId
where p.EntitySecurityKey = act.ActivityId and o.Name = '/operation'
and u.Name = 'user'
order by p.Level desc, p.Allow asc
)
这在SQL中效果很好,但我无法理解如何使用Linq进行等效操作.
This works beautifully in SQL but I just cannot fathom how to do the equivalent using Linq.
推荐答案
此处无需相关子查询.您的所有外部查询要做的就是在Allow == true
时获取EntitySecurityKey.Name
.您可以在查询后使用简单的if
语句执行该逻辑.
There is no need for a correlated sub-query here. All your outer query does is fetch EntitySecurityKey.Name
when Allow == true
. You can perform that logic with a simple if
statement after your query.
private string GetEntitySecurityKeyNameIfAllowed(ISession session, string operationName, string userName)
{
var result = session.Query<Permission>()
.Where(p => p.Operation.Name == operationName
&& p.User.Name == userName)
.OrderByDescending(p => p.Level)
.ThenBy(p => p.Allow)
.Select(p => new
{
p.Allow,
p.EntitySecurityKey.Name
})
.FirstOrDefault();
return result != null && result.Allow
? result.Name
: null;
}
这篇关于NHibernate 3.2 Linq与相关子查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文