簡體   English   中英

將SQL轉換為linq語句

[英]Convert SQL to linq statement

我想將下面的SQL語法轉換為linq語句,以獲取單個布爾結果。 SQL正在檢查用戶是否當前角色。

select case
     when exists (select 1
                   from Global.Application as a
                   join Global.Role as r on a.ID = r.ApplicationId and r.Name = 'GlobalAdmin'
                   join Global.[Authorization] as au on a.ID = au.ApplicationId and r.ID = au.RoleId
                   join Global.[User] as u on au.UserId = u.ID and u.UserPrincipalName = 'domain\username'
                  where a.EnableApplication = 1 and EnableAuthorization = 1 and EnableRoles = 1 and a.ID = 1)
     then CAST(1 as BIT)
     else CAST(0 as BIT)
   end as UserExists

我嘗試了以下linq語法都無濟於事。 知道我可以做些什么來使case語句返回布爾結果嗎?

var result = (from a in _applicationRepository.GetList(a => a.ID == applicationId)
                      from r in _roleRepository.GetList(r => r.ApplicationId == a.ID && r.Name == rolename)
                      from au in _authorizationRepository.GetList(au => au.ApplicationId == a.ID && r.ID == au.RoleId)
                      from u in _userRepository.GetList(u => u.ID == au.UserId && u.UserPrincipalName == username)
                      where a.EnableApplication == true && a.EnableAuthorization == true && a.EnableRoles == true && a.ID == applicationId
                      select (new bool{UserExists = 1 })).Single();

只需使用Any(),它將返回一個布爾值,如果查詢返回任何內容,則返回true,否則返回false。

var result =(from a in _applicationRepository.GetList(a => a.ID == applicationId)
                      from r in _roleRepository.GetList(r => r.ApplicationId == a.ID && r.Name == rolename)
                      from au in _authorizationRepository.GetList(au => au.ApplicationId == a.ID && r.ID == au.RoleId)
                      from u in _userRepository.GetList(u => u.ID == au.UserId && u.UserPrincipalName == username)
                      where a.EnableApplication == true && a.EnableAuthorization == true && a.EnableRoles == true && a.ID == applicationId
                      //select 1, or a, or anything, it doesn't really mind
                      select 1).Any();

順便說一句,您的查詢也可以在linq中使用join重寫,但這是另一個問題;)

如果存在一個或多個滿足查詢條件的記錄,則以下操作應該使用聯接(如果不是提高速度性能的好處,則更加可維護/可讀)和Any()linq方法來返回布爾值。

bool exists = (from a in Global.Application
                join Global.Role as r on a.ID equals r.ApplicationId
                join Global.[Authorization] as auth on a.ID equals auth.ApplicationId
                join Global.[User] as user on auth.UserId equals user.ID
                where a.EnableApplication == 1
                && a.EnableAuthorization == 1
                && a.EnableRoles == 1
                && a.ID == 1
                && r.Name == "GlobalAdmin"
                && r.ID == auth.RoleId
                && user.UserPrincipalName == "domain\username"
                select a.ID).Any();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM