c# - update - Cómo retirar todos los datos padre/hijo en un objeto complejo usando ORM dapper en.Net
dapper update multiple (2)
Tengo estas dos tablas con una relación de una (categoría) a muchas (producto) en la base de datos
Table Product
Name
Description
ProductCategory
Table Category
Category
Description
Y estas clases;
public class Product
{
public string Name { get; set; }
public string Description { get; set; }
public Category CategoryName { get; set}
}
public class Category
{
public string CategoryName { get; set; }
public string Description { get; set; }
}
Quiero recuperar una lista con todos los datos de productos y categorías de objetos en una lista. He leído sobre multipleResults y queryMultiple pero no puedo ver cómo unir los dos. Sé cómo hacerlo para un solo producto, pero ¿qué pasa con todos los productos con sus objetos de categoría individual también?
Esto debería hacer lo que desees:
var res = db.Query<Product, Category, Product>(
@"select p.[Name], p.[Description], c.Category, c.Category as [CategoryName], c.Description
from Product p
inner join Category c on c.Category = p.ProductCategory",
(prd, cat) => {
prd.CategoryName = cat;
return prd;
},
splitOn: "Category"
).AsQueryable();
Además, el nombre de Nombre de CategoryName
que eligió para una de las propiedades del Product
es inconveniente.
Te sugiero que cambies tu clase de Product
esta manera:
public class Product
{
public string Name { get; set; }
public string Description { get; set; }
public Category Category { get; set; }
}
Entonces la consulta puede ser más limpia:
var res = db.Query<Product, Category, Product>(
@"select p.[Name], p.[Description], c.Category as [CategoryName], c.Description
from Product p
inner join Category c on c.Category = p.ProductCategory",
(prd, cat) => {
prd.Category = cat;
return prd;
},
splitOn: "CategoryName"
).AsQueryable();
Supongamos que tiene sus tablas como esta.
Producto
ID
ProductName
ProductCategoryID
Categoría
ID
CategoryName
y tus clases
public class Product
{
public int ID { set; get; }
public string ProductName { set; get; }
public int ProductCategoryID {set;get;}
public Category Category { set; get; }
}
public class Category
{
public int ID { set; get; }
public string CategoryName { set; get; }
}
El siguiente código debería funcionar bien para que cargue una lista de productos con categorías asociadas.
var conString="Replace your connection string here";
using (var conn = new SqlConnection(conString))
{
conn.Open();
string qry = "SELECT P.ID,P.ProductName,P.ProductCategoryID,C.ID,
C.CategoryName from Product P INNER JOIN
Category C ON P.ProductCategoryID=C.ID";
var products = conn.Query<Product, Category, Product>
(qry, (prod, cat) => { prod.Category = cat; return prod; });
foreach (Product product in products)
{
//do something with the products now as you like.
}
conn.Close();
}
Nota: Dapper asume que sus columnas de Id se llaman "Id" o "id", si su clave principal es diferente o si desea dividir la fila ancha en un punto que no sea "Id", use el parámetro opcional ''splitOn''.