Digamos que tengo las siguientes entidades.
class Product { public int Id { get; set; } public string Name { get; set; } } class ProductAlias { public int ProductId { get; set; } public string Alias { get; set; } } Dado un ID de producto, ¿cómo podría crear una lista de todos los alias para ese producto que incluya el Name del producto en una sola consulta?
No sé si puedo hacer algo como lo siguiente. Esta sintaxis no funciona porque Union() no toma una expresión lambda.
DbContext.Products .Where(p => p.Id == productId) .Select(p => p.Name) .Union(p => p.ProductAliases.Select(a => a.Alias)) .ToList();Una las dos tablas en Id y ProductId , seleccione todos los atributos necesarios ( Id , Name , Alias ) y filtre en Id .
products .Join(aliases, p => p.Id, a => a.ProductId, (p,a) => new { p.Name, p.Id, a.Alias}) .Where(p => p.Id == productId);En otra forma:
(from p in products join a in aliases on p.Id equals a.ProductId select new { p.Name, p.Id, a.Alias }) .Where(p => p.Id == productId);El resultado (con LINQ2Object para la prueba, pero debería funcionar también con LINQ2SQL):
Prueba lo siguiente:
var products = DbContext.Products .Where(p => p.Id == productId); products .Select(p => p.Name) .Union(products.SelectMany(p => p.ProductAliases.Select(a => a.Alias))) .ToList();Puede hacer el equivalente a un SQL Server unpivot como este
DbContext.Products .Where(p => p.Id == productId) .SelectMany(p => p.ProductAliases.Select(a => a.Alias).Append(p.Name)) .ToList();