我想用Linq
做一個非常簡單的任務,並且已經卡住了。這真的很可怕,但我想,最好知道使用這個帖子。我有兩張桌子。一個是產品另一個是等級。以下是演示腳本:關於Linq查詢的問題
CREATE TABLE [dbo].[Products](
[ProductID] [int] IDENTITY(1,1) PRIMARY KEY,
[ProductName] [varchar](40) NULL,
[Price] [float] NULL,
[Details] [varchar](max) NULL,
[CategoryID] [int] NULL
)
INSERT [dbo].[Products] ([ProductID], [ProductName], [Price], [Details], [CategoryID]) VALUES (1, N'Denim', 1200, NULL, 1)
INSERT [dbo].[Products] ([ProductID], [ProductName], [Price], [Details], [CategoryID]) VALUES (2, N'Denim 2', 220, NULL, 1)
INSERT [dbo].[Products] ([ProductID], [ProductName], [Price], [Details], [CategoryID]) VALUES (3, N'Pringles', 240, NULL, 2)
INSERT [dbo].[Products] ([ProductID], [ProductName], [Price], [Details], [CategoryID]) VALUES (4, N'Pringles 2', 260, NULL, 2)
INSERT [dbo].[Products] ([ProductID], [ProductName], [Price], [Details], [CategoryID]) VALUES (5, N'Pringles 3', 240, NULL, 2)
CREATE TABLE [dbo].[Ratings](
[AutoId] [int] IDENTITY(1,1) PRIMARY KEY,
[ProductId] [int] NOT NULL,
[UserRating] [float] NOT NULL
)
INSERT [dbo].[Ratings] ([AutoId], [ProductId], [UserRating]) VALUES (4, 2, 1.5)
INSERT [dbo].[Ratings] ([AutoId], [ProductId], [UserRating]) VALUES (5, 4, 2.5)
INSERT [dbo].[Ratings] ([AutoId], [ProductId], [UserRating]) VALUES (6, 1, 5)
INSERT [dbo].[Ratings] ([AutoId], [ProductId], [UserRating]) VALUES (7, 2, 2.5)
和輸出應該是以下幾點:
ProductId - ProductName - User Rating
1 - Denim - 5
2 - Denim 2 - 2
3 - Pringles - 0
4 - Pringles 2 - 2.5
5 - Pringles 3 - 0
這是一個項目的評級系統,我試圖讓使用Linq
上面的輸出。用下面的Sql
,我得到的結果是:
SELECT m.ProductId, m.ProductName, ISNULL(SUM(k.UserRating)/COUNT(k.ProductId), 0) AS 'User Rating' FROM Products m
LEFT JOIN Ratings k ON k.ProductId = m.ProductID
GROUP BY m.ProductID, m.ProductName
不幸的是,以下Linq
,我只得到,在評級存在表中的評級信息:
var con = (from c in db.Ratings
join d in db.Products on c.ProductId equals d.ProductID into ps
from rt in ps.DefaultIfEmpty()
group new { c, ps } by new { rt.ProductID, rt.ProductName } into g
select new ProductRating
{
ProductId = g.Key.ProductID,
ProductName = g.Key.ProductName,
Total = g.Sum(c => c.c.UserRating)/g.Count()
}).ToList();
注:我的目標是獲得評級表中不存在的評級詳細信息(產品評分總和)以及存在的評分詳情(如果沒有數據,則返回'0')。
更新1 - 類ProductRating:
public class ProductRating {
public int ProductId { get; set; }
public string ProductName { get; set; }
public double Total { get; set; } //Property for the rating
}
更新2 - 一流的產品和評級:
public partial class Products
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public Nullable<double> Price { get; set; }
public string Details { get; set; }
public Nullable<int> CategoryID { get; set; }
public ICollection<Ratings> Rating { get; set; }
}
public partial class Ratings
{
public int AutoId { get; set; }
public int ProductId { get; set; }
public double UserRating { get; set; }
}
使用了以下的Linq
查詢並得到這個錯誤 - 指定LINQ to Entities不支持類型成員'Rating'。只有初始化,實體成員和實體導航屬性都支持:
var con = db.Products.Select(c => new ProductRating
{
ProductId = c.ProductID,
ProductName = c.ProductName,
Total = c.Rating.Average(d => (double?)d.UserRating) ?? 0
}).ToList();
更新3:現在收到此錯誤 - 錯誤2016年爲條件指定的值不與成員的類型兼容,這是我試過的導航屬性:
注:我修改Andrés Robinet
的查詢和它的工作,雖然使用Join
。
你已經搞亂了LINQ查詢中左外連接的左邊和右邊部分。你有沒有導航財產,像'公衆ICollection評級{get;組; }'在'Product'類中?什麼是ORM - 例如LINQ to SQL,EF6,EF Core或? –
我正在使用EF 6.0,它有一個名爲'Total'的屬性。在帖子中更新。 –