c# – 最好的方法来提取与dapper dot网络orm的一对多的关系?

我有两个课程“产品”和“卖家”.
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; }
}

我想使用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);

有没有更好的方法

解决方法

我想你正在混合你想要如何使用它来存储数据.我建议你的数据库规范化.
//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; }
}

然后可以直接查询卖家和产品表.

var Sellers = connection.Query<Seller>("Select * from Seller");
var Products = connection.Query<Product>("Select * from Product");

然后使用linq“group by”将产品投入到字典中

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

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

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

这是答案的结束,但是如果您真的需要与卖家混合的产品,您可以使用上述相同的数据库结构,并执行以下操作:

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)

然后使用linq“group by”函数将其抛入一个字典中.我建议看看这个“Linq group-by multiple fields”的帖子,以帮助该组由linq

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...