2017-04-05 4 views
0

Ich bin neu bei LINQ. Ich habe die folgenden drei Datenbanktabellen.LINQ. Übereinstimmende Datensätze aus der zweiten Tabelle zurückgeben.

class Districts{ 
    public int id{get;set;} 
    public String DistrictName{get;set;} 
} 

class Users{ 
public int id{get;set;} 
public String Username{get;set;} 
//etc 
} 

und eine Tabelle Join

class UserDistricts{ 
public int id{get;set;} 
public int Userid{get;set;} 
public int DistrictId{get;set;} 
} 

ich die DistrictNames auf einen bestimmten Benutzer durch seine Benutzer-ID identifiziert zugeordnet finden möchten.

List<int> districtsAssigned = (from aDistrict in p.UserDistricts where 
aDistrict.UserId == userId select aDistrict.DistrictId).ToList(); 

Der obige Code gibt mir die DistrictId für einen bestimmten Benutzer. Ich möchte, dass es mit den Bezirkstabellen übereinstimmt und gebe mir den Distriktnamen zurück. Ich stecke hier fest.

Die äquivalente SQL-Abfrage wäre wie folgt.

select U.DistrictId,D.DistrictName,userId from UserDistricts U 
INNER JOIN Districts D on D.DistrictId=U.DistrictId 
where [email protected] 

Jede Hilfe würde sehr geschätzt werden.

+0

Bitte versuchen Sie es mit SO Linq Dokumentation für [Joins] (http: // stackoverfl ow.com/documentation/c%23/68/linq-queries/2994/joins-inner-left-right-cross-and-full-outer-joins#t=201704050730121811661) –

+0

Warum haben Sie diese Tabelle? UserDistrikte? Ist es eine Viele-zu-Viele-Beziehung mit Distrikten und Benutzern? Wenn ja, brauchst du nicht 'public int id {get; set;} 'innerhalb der UserDistricts, nur links- und rightkey – Valkyrie

+0

sag mir auch an Benutzt du LINQ to SQL? oder Entitätsrahmen/LINQ2Entities? – Valkyrie

Antwort

0

Es gibt eine join in LINQ auch:

from userDistrict in p.UserDistricts 
join district in p.Districts on userDistrict.DistrictId equals district.id 
where userDistrict.UserId == userId 
select district.DistrictName 

Ein Join ist nicht sehr oft in LINQ verwendet, da es andere, flexiblere Optionen. In diesem Fall wäre dies:

from userDistrict in p.UserDistricts 
from district in p.Districts 
where (userDistrict.DistrictId == district.id) && (userDistrict.UserId == userId) 
select district.DistrictName 

Diese für komplexe ermöglicht Join-Bedingungen, während join nur Vergleich auf Gleichheit ermöglicht.

+0

Danke, dass die Arbeit gemacht hat. –

0

ich denke, es einfacher sein wird, mit Syntax-Abfrage:

var entryPoint = (from U in Users 
       join ud in UserDistricts on U.UserID equal ud.UserID 
       join d in Districts on d.DistrictID equals ud.DistrictID 
       where ud.UserID == U.UserID 
       select new { 
        DistrictId = ud.DistrictId, 
        DistrictName= d.DistrictName, 
        UserID= U.UserID 
       }).ToList(); 

Hoffe, es hilft.

+0

Dies wird nicht kompiliert, da die Syntax falsch ist. – Sefe

0

eine virtuelle Beziehung zwischen Klassen erstellen und wir können sie leicht mit Hilfe von Eigenschaften Navigation

class UserDistricts{ 
public int id{get;set;} 
public Users Userid{get;set;} 
public Districts DistrictId{get;set;} 
} 

dann erstellen Sie ein Ansichtsmodell wie

class DistrictDetails{ 
    public int userId {get;set;} 
    public string DistrictName{get;set;} 
    public int DistrictId{get;set;} 
} 

Danach achive Sie diesen Typ der hinzufügen Liste wie folgt

List<DistrictDetails> districtsAssigned = _context.UserDistricts 
    .Where(x=>x.Userid == userId) 
    .Select(y=> new DistrictDetails 
     { 
      DistrictId==y.Districts.DistrictId, 
      DistrictName=y.Districts.DistrictName, 
      userId == y.d 
     }).ToList(); 
Verwandte Themen