【问题标题】: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
                      };

【问题讨论】:

    标签: c# .net sql-server linq


    【解决方案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() 
                             };
              }
      

      【讨论】:

        猜你喜欢
        • 2015-12-28
        • 2020-12-18
        • 2016-08-27
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 2011-08-24
        相关资源
        最近更新 更多