LRP*_*LRP 22 c# multiple-resultsets dapper
我在数据库中有这两个表与一个(类别)到多个(产品)关系
Table Product
Name
Description
ProductCategory
Table Category
Category
Description
Run Code Online (Sandbox Code Playgroud)
而这些课程;
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; }
}
Run Code Online (Sandbox Code Playgroud)
我想在列表中找到包含所有产品和类别对象数据的列表.我已经阅读了关于multipleResults和queryMultiple但是看不到如何将两者结合在一起.我知道如何为单个产品做到这一点但是所有具有各自类别对象的产品也是如此.
Shy*_*yju 24
假设你有这样的表.
产品
ID
ProductName
ProductCategoryID
Run Code Online (Sandbox Code Playgroud)
类别
ID
CategoryName
Run Code Online (Sandbox Code Playgroud)
和你的课程
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; }
}
Run Code Online (Sandbox Code Playgroud)
以下代码应该可以正常工作,以加载具有相关类别的产品列表.
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();
}
Run Code Online (Sandbox Code Playgroud)
注意: Dapper假设您的Id列被命名为"Id"或"id",如果您的主键不同或者您想要在"Id"以外的点处拆分宽行,请使用可选的"splitOn"参数.
这应该做你想要的:
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();
Run Code Online (Sandbox Code Playgroud)
此外,CategoryName您为其中一个Product属性选择的名称不方便.
我建议你改变你这样的Product课程:
public class Product
{
public string Name { get; set; }
public string Description { get; set; }
public Category Category { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后查询可以变得更清洁:
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();
Run Code Online (Sandbox Code Playgroud)