2008-08-28 57 views
48

Esta consulta funciona muy bien:LINQ seleccionar entre varias tablas

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

me sale un nuevo tipo con mis campos 'OP'. Ahora quiero recuperar mis campos 'pg' también, pero

select op, pg).SingleOrDefault(); 

no funciona.

¿Cómo puedo seleccionar todo de ambas tablas para que aparezcan en mi nuevo tipo de páginaObjeto?

Respuesta

79

Puede utilizar los tipos anónimos para esto, es decir:

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

Esto hará que PageObject en un IEnumerable de un tipo anónimo de modo que yo sepa no podrá pasarlo a otros métodos, sin embargo, si simplemente está obteniendo datos para jugar en el método En este momento estás perfectamente bien. También puede nombrar propiedades en su tipo anónimo, es decir: -

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

Esto le permitirá decir: -

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

Por ejemplo :-)

2

Debe crear un nuevo tipo anónimo:

select new { op, pg } 

Consulte la guide oficial.

1

cambio

select op) 

a

select new { op, pg }) 
6

Si no desea para usar tipos anónimos b/c, digamos que está pasando el objeto a otro método, puede usar la opción de carga LoadWith para cargar los datos asociados. Requiere que sus tablas estén asociadas ya sea a través de claves externas o en su modelo 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 

A continuación, puede llamar

pageObject.Pages.PageID 

Dependiendo de lo que sus datos se parece, lo que probablemente quiere hacer esto al revés,

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 el tipo anónimo le causa problemas, puede crear una clase de datos simple:

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

y luego en su consulta:

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

entonces puede pasar esto alrededor:

return queryResult.SingleOrDefault(); // as PermissionsAndPages