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?

È stato utile?

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;

È necessario creare un nuovo tipo anonimo:

 select new { op, pg }

Consultare ufficiale guida.

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 })
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top