Как отменить все родительские/дочерние данные в сложном объекте с использованием dapper ORM в .Net
У меня эти две таблицы с одной (категорией) ко многим (продуктовым) отношениям в базе данных
Table Product
Name
Description
ProductCategory
Table Category
Category
Description
И эти классы;
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; }
}
Я хочу получить список обратно со всеми данными о объектах и категориях объектов в списке. Я читал о multipleResults и queryMultiple, но не вижу, как связать их вместе. Я знаю, как это сделать для одного продукта, но как и все продукты с их отдельными объектами категории.
Ответы
Ответ 1
Предположим, что у вас есть ваши таблицы.
продукт
ID
ProductName
ProductCategoryID
Категория
ID
CategoryName
и ваши классы
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; }
}
Нижеприведенный код должен работать нормально, если вы загрузите список продуктов со связанными категориями.
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();
}
Примечание.. Dapper предполагает, что ваши столбцы идентификатора Id называются "Id" или "id", если ваш первичный ключ отличается или вы хотите разделить большую строку в точке, отличной от "Id", используйте необязательный Параметр "splitOn".
Ответ 2
Это должно делать то, что вы пожелаете:
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();
Кроме того, имя CategoryName
, которое вы выбрали для одного из свойств Product
, неудобно.
Я предлагаю вам изменить класс Product
следующим образом:
public class Product
{
public string Name { get; set; }
public string Description { get; set; }
public Category Category { get; set; }
}
Тогда запрос может стать более чистым:
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();