52 votes

Choisissez parmi plusieurs tables en utilisant LINQ

Cette requête fonctionne très bien:

 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();
 

Je reçois un nouveau type avec mes champs "op". Maintenant, je veux aussi récupérer mes champs 'pg', mais

 select op, pg).SingleOrDefault();
 

ne fonctionne pas.

Comment puis-je sélectionner tout ce qui se trouve dans les deux tableaux afin qu'ils apparaissent dans mon nouveau type pageObject?

85voto

ljs Points 16511

Vous pouvez utiliser les types anonymes pour cela, c'est à 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 { pg, op }).SingleOrDefault();

Cela va faire pageObject dans un IEnumerable d'un type anonyme, donc autant que je sache, vous ne serez pas en mesure de les passer à d'autres méthodes, cependant, si vous êtes tout simplement obtenir des données pour jouer avec dans la méthode, vous êtes actuellement dans c'est très bien. Vous pouvez également nommer les propriétés de votre type anonyme, c'est à 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();

Cela vous permettra de dire:-

if (pageObject.PermissionName.FooBar == "golden goose") Application.Exit();

Par exemple :-)

7voto

Codewerks Points 3284

Si vous ne souhaitez pas utiliser des types anonymes b / c, si vous transmettez l'objet à une autre méthode, vous pouvez utiliser l'option de chargement LoadWith pour charger les données associées. Cela nécessite que vos tables soient associées via des clés étrangères ou dans votre modèle dbml Linq-to-SQL.

 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
 

Ensuite, vous pouvez appeler

 pageObject.Pages.PageID
 

En fonction de l'apparence de vos données, vous voudrez probablement le faire dans l'autre sens.

 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;
 

3voto

Konrad Rudolph Points 231505

Vous devez créer un nouveau type anonyme:

  select new { op, pg }
 

Reportez-vous au guide officiel.

2voto

daviddeath Points 120

Si le type anonyme vous cause des problèmes, vous pouvez créer une classe de données simple:

 public class PermissionsAndPages
{
     public ObjectPermissions Permissions {get;set}
     public Pages Pages {get;set}
}
 

et ensuite dans votre requête:

 select new PermissionsAndPages { Permissions = op, Page = pg };
 

Ensuite, vous pouvez faire circuler ceci:

 return queryResult.SingleOrDefault(); // as PermissionsAndPages
 

1voto

aku Points 54867

changement

 select op)
 

à

 select new { op, pg })
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X