2008-08-28 11 views
48

Cette requête fonctionne très bien:Création d'un LINQ sélectionner à partir de plusieurs tables

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 récupérer mes champs 'pg' aussi, mais

select op, pg).SingleOrDefault(); 

ne fonctionne pas. Comment puis-je sélectionner tout de ces deux tableaux afin qu'ils apparaissent dans mon nouveau type d'objet pageObject?

Répondre

79

Vous pouvez utiliser des types anonymes pour cela, à savoir:

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 fera PageObject dans un IEnumerable d'un type anonyme afin AFAIK vous ne serez pas en mesure de le passer à d'autres méthodes, mais si vous obtenez simplement des données pour jouer avec la méthode vous êtes actuellement dedans c'est parfaitement bien. Vous pouvez également nommer des propriétés dans votre type anonyme, à savoir: -

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 :-)

2

Vous devez créer un nouveau type anonyme:

select new { op, pg } 

Référez-vous au guide officiel.

1

changement

select op) 

à

select new { op, pg }) 
6

Si vous ne voulez pas Pour utiliser des types anonymes b/c disons que vous passez 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 Linb-to-SQL dbml.

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 

Selon ce que vos données ressemble, vous voudrez probablement faire l'inverse,

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; 
2

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

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

puis dans votre requête:

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

Ensuite, vous pouvez passer ce autour de:

return queryResult.SingleOrDefault(); // as PermissionsAndPages 
Questions connexes