2017-07-13 1 views
0

Ich versuche, eine LINQ-Abfrage äquivalent zu schreiben unter SQLEquivalent LINQ-Abfrage für SQL-Abfrage resultierenden nicht in der erwarteten Ergebnissen

SELECT DISTINCT m.*,rm.RoleId FROM dbo.Menu m 
INNER JOIN dbo.RoleMenu rm on m.Id=rm.MenuId 
INNER JOIN dbo.RoleUser ru on rm.RoleId=ru.RoleId 
WHERE ru.UserName='[email protected]' and m.Url='/dashboard#/pm' 

ich mit der folgenden Abfrage kam, die nicht die erwartete Ausgabe

var auth = _context.RoleUsers.Where(
    x => x.Role.MenuRoles.FirstOrDefault().Menu.Url == pagePermissions.Url 
     && x.UserName == pagePermissions.UserName).Count() 
kehrt zurück

Darf ich einen besseren Weg wissen, dies zu tun?

Antwort

3

Ihr SQL sieht alle Menüs an, die sich auf einen Rollenbenutzer beziehen, aber Ihr Linq betrachtet nur den ersten. Ich denke du willst x.Role.MenuRoles.Any(mr => mr.Menu.Url == pagePermissions.Url). Aber dann machst du auch einen Count auf den passenden Benutzern, anstatt die Menüs auszuwählen, die dieser URL entsprechen. Eine engere Übersetzung wäre.

var results = (from m in _context.Menus 
       from rm in m.RoleMenus 
       from ru in rm.RoleUsers 
       where m.Url == pagePermissions.Url 
        && u.UserName == pagePermissions.UserName 
       select new { Menu = m, rm.RoleId }).Distinct(); 

Sie müssen möglicherweise einige der Navigationseigenschaften anpassen, da ich nur sie erraten habe. Sie sind normalerweise Pluralisierungen der Tabellen, aber ich sehe in Ihrem Linq, dass Sie MenuRoles anstelle von RoleMenus haben.

Verwandte Themen