从连接表中选择计数
Posted
技术标签:
【中文标题】从连接表中选择计数【英文标题】:Select count from joined tables 【发布时间】:2022-01-11 13:11:31 【问题描述】:我有两个表,CaseProductLinks
和 Products
,如下所示:
我正在尝试使用 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()
;
【讨论】:
以上是关于从连接表中选择计数的主要内容,如果未能解决你的问题,请参考以下文章