我有兩個表,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
};
uj5u.com熱心網友回復:
如果您正確設定了導航(即Product有一個ICollection<CaseProductLink> CaseProductLinks),您可以簡單地執行以下操作:
var r = _db.Products.Select(p =>
new
{
p.ProductId,
p.ProductName,
Frequency = p.CaseProductLinks.Count()
}
);
這是我將在 SQL 中執行的操作:
如果您已經非常習慣 SQL,那么您可以將自己從這些方式的思考中拉出來,轉而采用 EF 旨在對它們進行抽象的方式。EF 的一大優點是告訴它您的資料庫表/物體如何相互關聯,然后它將形成連接。它不是一些愚蠢的設備,必須用它來制作它所做的每一個加入和組;如果它知道有 1 個帶有 Many CaseProductLink 的 Product,那么它可以撰寫連接/組來計算每個 P 的關聯 CPL 的數量,只需通過聚合操作訪問 Product 上的集合(計數)
如果你沒有設定這個導航,那么我真的會建議你這樣做,因為它是 EF 美的一大塊,它使 C# 端代碼很好用
uj5u.com熱心網友回復:
我測驗下面的代碼并且作業正常。請檢查它
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()
};
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/374501.html
標籤:C# 。网 sql-server 林克
上一篇:LINQSelectMany在嵌套過濾中回傳子項而不是父項
下一篇:執行通配符搜索
