用dapper dot net orm提取一对多关系的最佳方法?

ami*_*min 11 c# orm one-to-many dapper

我有两个班级'产品'和'卖家'.

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

    public Seller Seller { get; set; }
    public int? SellerId { get; set; }
}
public class Seller
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想使用dapper提取所有产品的卖家列表.

目前我这样做:

Dictionary<int, Seller> dic = new Dictionary<int, Seller>();
        Conn.Query<Seller, Product, int>
            (@"select s.*,p.* from Sellers s Join Products p 
                on p.SellerId = s.Id",
            (s, p) => {
                if (dic.ContainsKey(s.Id))
                    dic[s.Id].Products.Add(p);
                else
                {
                    s.Products = new List<Product>();
                    s.Products.Add(p);
                    dic.Add(s.Id, s);
                }
                return s.Id; 
            });
        var sellers = dic.Select(pair => pair.Value);
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法?

Bra*_*yce 3

我认为您正在混合存储数据的方式与使用数据的方式。我建议规范化你的数据库。

//Normalized Database classes
public class Seller
{
    public int Id { get; set; }  // primary key
    public string Name { get; set; }
}

public class Product
{
    public int Id { get; set; }  // primary key
    public int SellerId { get; set; } // foreign key
    public string Name { get; set; }
    public decimal Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后就可以直接查询Seller表和Product表了。

var Sellers = connection.Query<Seller>("Select * from Seller");
var Products = connection.Query<Product>("Select * from Product");
Run Code Online (Sandbox Code Playgroud)

然后使用linq“group by”将Product放入字典中

var SellerWithProductsDict = 
        (from prod
        in Products 
        group prod by prod.SellerId
        into groupedProducts
        select groupedProducts)
        .ToDictionary(gp => gp.SellerId, gp => gp.ToList());
Run Code Online (Sandbox Code Playgroud)

然后您可以循环遍历 SellerWithProductsDict 以查看所有卖家产品,如果您需要卖家名称,只需从 Sellers 查询结果中通过索引获取即可

******************************************

这就是答案的结束,但如果您确实需要将产品与卖家混合在一起,您可以使用上面相同的数据库结构并执行以下操作:

var qry = @"Select s.Id as SellerId,
                   s.Name as SellerName,
                   p.Id as ProductId,
                   p.Name as ProductName,
                   p.Price as ProductPrice
            From Seller as s, Product as p
            Where s.Id = p.id"

var SellerWithProducts = connection.Query(qry)
Run Code Online (Sandbox Code Playgroud)

然后使用 linq“group by”函数将其放入字典中。我建议查看此“ Linq group-by multiple fields ”帖子以获取有关 linq 分组的帮助

  • 切勿修改域类以匹配 ORM 和 DAL 层的数据库架构。您的类应该映射到您的业务领域和您的数据,而不是标准化的数据库模式。 (5认同)