c# - soporta - Crear un LINQ seleccionar de varias tablas
optimizar consultas lentas mysql (5)
Debe crear un nuevo tipo anónimo:
select new { op, pg }
Consulte la guide oficial.
Esta consulta funciona muy 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();
Obtengo 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 en ambas tablas para que aparezcan en mi nuevo tipo de páginaObjeto?
Puede usar 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 convertirá a pageObject en un IEnumerable de tipo anónimo, por lo que AFAIK no podrá pasarlo a otros métodos, sin embargo, si simplemente está obteniendo datos para jugar en el método en el que se encuentra actualmente, está 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 te permitirá decir:
if (pageObject.PermissionName.FooBar == "golden goose") Application.Exit();
Por ejemplo :-)
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 tu consulta:
select new PermissionsAndPages { Permissions = op, Page = pg };
Entonces puedes pasar esto:
return queryResult.SingleOrDefault(); // as PermissionsAndPages
Si no desea utilizar 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
Entonces puedes llamar
pageObject.Pages.PageID
Dependiendo de cómo se ve tu información, probablemente quieras 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;
cambio
select op)
a
select new { op, pg })