从连接表中选择计数

Posted

技术标签:

【中文标题】从连接表中选择计数【英文标题】:Select count from joined tables 【发布时间】:2022-01-11 13:11:31 【问题描述】:

我有两个表,CaseProductLinksProducts,如下所示:

我正在尝试使用 LINQ 获取以下信息:

这是我将在 SQL 中执行的操作:

SELECT 
    p.ProductID, p.ProductName, 
    COUNT(c.CaseID) AS Frequency 
FROM 
    CaseProductLinks c 
JOIN
    Products p ON c.ProductID = p.ProductID 
GROUP BY 
    p.ProductID

到目前为止,这是我在 C# 中所拥有的抛出“System.InvalidOperationException”的内容:

var objs = from p in _db.CaseProductLinks   
           join c in _db.Cases on p.ProductId equals c.ProductId into g
           select new S_Link
                      
                           ProductID = p.ProductId,
                           ProductName = p.Product,
                           Frequency = g.Count() //Not sure what to do here
                      ;

【问题讨论】:

【参考方案1】:

如果您的导航设置正确(即Product 有一个ICollection<CaseProductLink> CaseProductLinks),您可以这样做:

var r = _db.Products.Select(p =>
   new 
   
       p.ProductId,
       p.ProductName,
       Frequency = p.CaseProductLinks.Count() 
   
);

这是我将在 SQL 中执行的操作:

如果您已经习惯了 SQL,这可能是让您摆脱以这些方式思考并进入 EF 旨在抽象它们的方式的一个步骤。 EF 的一大优点是告诉它您的数据库表/实体如何相互关联,然后它将形成连接。它不是一些愚蠢的设备,它必须被猛烈抨击才能进行它所做的每一个加入和组;如果它知道有 1 个具有许多 CaseProductLink 的产品,那么它可以编写连接/组来计算每个 P 的相关 CPL 的数量,只需使用聚合(计数)的操作访问 Product 上的集合

如果您没有设置此导航,那么我真的建议您这样做,因为它是 EF 的一大块美丽之处,它使 C# 端代码很适合使用

【讨论】:

【参考方案2】:

我测试下面的代码并且工作正常。请检查它

  public class Productlinks
        
            public int  CaseId  get; set; 
            public int ProductId  get; set; 
        

        public class Products
        
            public int ProductId  get; set; 
            public string ProductName  get; set; 
        
        static void Main(string[] args)
        
            var products = new List<Products>()
            
                new Products()  ProductId=1, ProductName="A",
                new Products()  ProductId=2, ProductName="B",
                new Products()  ProductId=3, ProductName="C",
            ;
            var links = new List<Productlinks>()
            
                new Productlinks() CaseId=1, ProductId=1 ,
                new Productlinks() CaseId=3, ProductId=2 ,
                new Productlinks() CaseId=3, ProductId=2 ,
                new Productlinks() CaseId=4, ProductId=3 ,
            ;

            var objs = from p in products
                       join c in links on p.ProductId equals c.ProductId into g
                       select new 
                       
                           ProductID = p.ProductId,
                           ProductName = p.ProductName,
                           Frequency = g.Count() 
                       ;
        

【讨论】:

以上是关于从连接表中选择计数的主要内容,如果未能解决你的问题,请参考以下文章

从一个表中选择,并从另外两个表中进行计数

从两个表中选择和计数

如何从表中选择所有列并计数?

HANA SQL 从一个表中找到的多个表中选择计数 (*)

如何从表中选择小时计数,包括缺失小时数?

使用联合第 2 部分从多个表中选择计数相关行