Erstellen einer LINQ-Auswahl aus mehreren Tabellen
Frage
Diese Abfrage funktioniert hervorragend:
var pageObject = (from op in db.ObjectPermissions
join pg in db.Pages on op.ObjectPermissionName equals page.PageName
where pg.PageID == page.PageID
select op)
.SingleOrDefault();
Ich erhalte einen neuen Typ mit meinen „Op“-Feldern.Jetzt möchte ich auch meine 'pg'-Felder abrufen, aber
select op, pg).SingleOrDefault();
funktioniert nicht.
Wie kann ich alles aus beiden Tabellen auswählen, damit es in meinem neuen pageObject-Typ angezeigt wird?
Lösung
Sie können hierfür anonyme Typen verwenden, d. h.:
var pageObject = (from op in db.ObjectPermissions
join pg in db.Pages on op.ObjectPermissionName equals page.PageName
where pg.PageID == page.PageID
select new { pg, op }).SingleOrDefault();
Dadurch wird pageObject zu einem IEnumerable eines anonymen Typs, sodass Sie es AFAIK nicht an andere Methoden weitergeben können. Wenn Sie jedoch lediglich Daten zum Spielen in der Methode erhalten, in der Sie sich gerade befinden, ist das völlig in Ordnung.Sie können Eigenschaften auch in Ihrem anonymen Typ benennen, d. h.:-
var pageObject = (from op in db.ObjectPermissions
join pg in db.Pages on op.ObjectPermissionName equals page.PageName
where pg.PageID == page.PageID
select new
{
PermissionName = pg,
ObjectPermission = op
}).SingleOrDefault();
Dadurch können Sie Folgendes sagen:
if (pageObject.PermissionName.FooBar == "golden goose") Application.Exit();
Zum Beispiel :-)
Andere Tipps
Wenn Sie keine anonymen Typen b/c verwenden möchten, sagen wir, Sie übergeben das Objekt an eine andere Methode, können Sie die LoadWith-Ladeoption verwenden, um zugehörige Daten zu laden.Es erfordert, dass Ihre Tabellen entweder über Fremdschlüssel oder in Ihrem Linq-to-SQL-DBML-Modell verknüpft sind.
db.DeferredLoadingEnabled = false;
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<ObjectPermissions>(op => op.Pages)
db.LoadOptions = dlo;
var pageObject = from op in db.ObjectPermissions
select op;
// no join needed
Dann können Sie anrufen
pageObject.Pages.PageID
Abhängig davon, wie Ihre Daten aussehen, möchten Sie dies wahrscheinlich umgekehrt tun.
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Pages>(p => p.ObjectPermissions)
db.LoadOptions = dlo;
var pageObject = from p in db.Pages
select p;
// no join needed
var objectPermissionName = pageObject.ObjectPermissions.ObjectPermissionName;
Sie müssen einen neuen anonymen Typ erstellen:
select new { op, pg }
Wenden Sie sich an den Beamten Führung.
Wenn Ihnen der anonyme Typ Probleme bereitet, können Sie eine einfache Datenklasse erstellen:
public class PermissionsAndPages
{
public ObjectPermissions Permissions {get;set}
public Pages Pages {get;set}
}
und dann in Ihrer Anfrage:
select new PermissionsAndPages { Permissions = op, Page = pg };
Dann können Sie das weitergeben:
return queryResult.SingleOrDefault(); // as PermissionsAndPages
ändern
select op)
Zu
select new { op, pg })