我怎样才能把这些行组合起来呢?
本文关键字:组合 起来 | 更新日期: 2023-09-27 18:17:03
我的Linq查询是
List<TopRated> TopRated = (from review in db.ProductReviews
group review by review.ProductID into product
select new TopRated
{
ProductName = product.Select(p => p.Products.Name).FirstOrDefault(),
Price = product.Select(p => p.Products.Price).FirstOrDefault(),
PriceOffer = product.Select(p => p.Products.PriceOffer).FirstOrDefault(),
ProductId = product.Key,
AverageRating = product.Average(p => p.Rating)
}).ToList();
我可以将这些行合并为一行吗?
ProductName = product.Select(p => p.Products.Name).FirstOrDefault(),
Price = product.Select(p => p.Products.Price).FirstOrDefault(),
PriceOffer = product.Select(p => p.Products.PriceOffer).FirstOrDefault(),
我认为我通过做类似于上面的事情来"添加过载"。
您可以使用使用范围变量的let子句。在我看来,它创建了一个直观而优雅的语法:
var TopRated = (from review in db.ProductReviews
group review by review.ProductID into product
let firstProduct = product.FirstOrDefault()
select new
{
ProductName = firstProduct.Products.Name,
Price = firstProduct.Products.Price,
PriceOffer = firstProduct.Products.PriceOffer,
ProductId = product.Key,
AverageRating = product.Average(p => p.Rating)
}).ToList();
要进行更深入的分析,您可以使用其中一个IL反编译器来查看每个建议的解决方案如何编译为IL。对于性能分析,您可以使用StopWatch
类进行测试。
可以,在某些情况下,它会极大地影响您的查询性能。
List<TopRated> TopRated = (from review in db.ProductReviews
group review by review.ProductID into product
select new
{
FirstProduct=product.FirstOrDefault(p=>p.Products)
ProductId = product.Key,
AverageRating = product.Average(p => p.Rating)
}).Select(product=>new TopRated {
ProductName = product.FirstProduct.Name,
Price = product.FirstProduct.Price,
PriceOffer = product.FirstProduct.PriceOffer,
ProductId = product.ProductId,
AverageRating = product.AverageRating
}).ToList();
你可以这样做:
List<TopRated> TopRated =
(from review in db.ProductReviews
group review by review.ProductID into product
select new { ProductId = product.Key, Products = product.FirstOrDefault().Products, AverageRating = product.Average(p => p.Rating) } into topRated
select new TopRated
{
ProductName = topRated.Products.Name,
Price = topRated.Products.Price,
PriceOffer = topRated.Products.PriceOffer,
ProductId = product.Key,
AverageRating = topRated.AverageRating
})
.ToList();
我很想知道这对查询性能有什么影响,以及由你的方法生成的查询和由这个方法生成的查询之间的差异。
可以,但最好先进行分组和聚合,然后通过join获取产品信息,如下所示:
var query = (from review in db.ProductReviews
group review by review.ProductID into reviews
select new { ProductId = reviews.Key, AverageRating = reviews.Average(item => item.Rating) } into summary
join product in db.Products on summary.ProductId equals product.Id
select new TopRated
{
ProductName = product.Name,
Price = product.Price,
PriceOffer = product.PriceOffer,
ProductId = product.Id,
AverageRating = summary.AverageRating
});
var sqlQuery = query.ToString();
var result = query.ToList();
或者在本例中(只有一个聚合)更简单:
var query = (from product in db.Products
select new TopRated
{
ProductName = product.Name,
Price = product.Price,
PriceOffer = product.PriceOffer,
ProductId = product.Id,
AverageRating = product.ProductReviews.Average(review => review.Rating)
});
var sqlQuery = query.ToString();
var result = query.ToList();