2011-06-02 129 views
3

任何人都可以幫助嘗試在Linq中執行以下SQL到NHibernate 3.2?NHibernate 3.2 Linq與相關的子查詢

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做等效。

+0

你有沒有這方面的運氣?我試圖做幾乎相同的事情。我有Linq語句算出來,並與LinqPad工作,但我不能讓NHibernate執行它。請參閱http://stackoverflow.com/questions/15206860/nhibernate-subquery-in-where-with-linq – Ragesh 2013-03-04 17:01:12

回答

0

這裏不需要相關的子查詢。當Allow == true時,您的所有外部查詢都會執行EntitySecurityKey.Name。您可以在查詢後用簡單的if語句執行該邏輯。

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; 
}