La creazione di un LINQ selezionare più tabelle
Domanda
Questa query funziona alla grande:
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();
Ho un nuovo tipo con la mia 'op' campi.Ora voglio recuperare il mio 'pg' campi, ma
select op, pg).SingleOrDefault();
non funziona.
Come posso selezionare tutto da entrambe le tabelle in modo che appaiano nella mia nuova pageObject tipo?
Soluzione
È possibile utilizzare i tipi anonimi per questo, cioè:
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();
Questo renderà pageObject in un oggetto IEnumerable di un tipo anonimo così, per quanto ne so non essere in grado di passare ad altri metodi, tuttavia, se si sta semplicemente ottenere i dati che gioca con il metodo che si sta attualmente è perfettamente bene.Si può anche il nome di proprietà di tipo anonimo, vale a dire:-
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();
Questo vi permetterà di dire:-
if (pageObject.PermissionName.FooBar == "golden goose") Application.Exit();
Per esempio :-)
Altri suggerimenti
Se non si desidera utilizzare i tipi anonimi b/c supponiamo che tu stia passando l'oggetto a un altro metodo, è possibile utilizzare il LoadWith opzione di caricamento per caricare i dati associati.Si richiede che le tabelle sono associate tramite le chiavi esterne o in Linq-to-SQL dbml modello.
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
Poi si può chiamare
pageObject.Pages.PageID
A seconda di cosa i vostri dati sembra, si sarebbe probabilmente desidera farlo in un altro modo,
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;
Se il tipo anonimo cause dei problemi, è possibile creare una semplice classe di dati:
public class PermissionsAndPages
{
public ObjectPermissions Permissions {get;set}
public Pages Pages {get;set}
}
e poi nella query:
select new PermissionsAndPages { Permissions = op, Page = pg };
Poi si può passare in questo giro:
return queryResult.SingleOrDefault(); // as PermissionsAndPages
cambiare
select op)
per
select new { op, pg })