繁体   English   中英

Dapper select 内部连接映射到 model

[英]Dapper select inner join mapping to a model

假设我有以下表格

  Table Products
  --------
  Id (int)
  Name (varchar)
  BrandId (int)

  Table Brands
  -----------
  Id (int)
  BrandName (varchar)

以及 CSharp 中的以下类

public class Product{
   public int Id { get; set;}
   public string Name { get;}
   public ProductBrand Brand { get;}
}
public class ProductBrand{
   public int Id { get; set;}
   public string BrandName { get;}
}

我如何将Select inner join两个表和 map 到ProductBrand model 及其所有属性?

您可以使用如下查询方法:

using (IDbConnection connection = new SqlConnection(ConnectionString))
{
    string sql = "SELECT Products.Id, BrandName FROM Products INNER JOIN Brands ON Products.BrandId = Brands.Id";
    var result = connection.Query<ProductBrand>(sql);
}

如果您想通过创建过程来使用它

CREATE PROCEDURE dbo.GetProducts

AS
BEGIN
    SELECT 
        Products.Id,
        Brands.BrandName
    FROM Products
        INNER JOIN
        Brands ON Products.BrandId  = Brands.Id

END
GO
using (IDbConnection db = new SqlConnection("ConnectionString"))
{
    
   var productBrands = db.Query<ProductBrand>("GetProducts").ToList();
    
}

Dapper 中的关系管理则相反——每个品牌都应该有一个产品列表。

所以类应该是这样的:

public class Product
{
    public int Id { get; set;}
    public string Name { get;}
}

public class Brand
{
    public int Id { get; set;}
    public string BrandName { get; set; }
    public ICollection<Product> Products { get; set; }
}

然后你可以这样查询:

var products = connection.QueryAsync<Product, Brand, Product>(sql, 
(product, brand) => {
    product.Brand = brand;
    return product;
},
splitOn: "BrandId");

工作代码,请进行如下更改,

    public class Product{
   public int Id { get; set;}
   public string ProductName { get;}
}
public class Brand{
   public int BrandId { get; set;}
   public string BrandName { get;}
   public IList<Product>Products { get;}
}

var sql ="SELECT Id, ProductName, BrandId, BrandName FROM Brand B INNER JOIN Product  P ON B.BrandId=P.BrandId"
var products = connection.QueryAsync<Brand, Product, Brand>(sql, 
(brand, product) => {
if(brand.Products==null)
{
    brand.Products = new List<Product>;
}
    brand.Products.Add(product);
    return brand;
},
splitOn: "BrandId");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM