我有以下两个表
public class Book
{
public int Id { get; set; }
[Required]
[StringLength(255)]
public string BookTitle { get; set; }
[Required]
[StringLength(255)]
public string Author { get; set; }
[Required]
[StringLength(400)]
public string Description { get; set; }
}
和
public class Rating
{
public int Id { get; set; }
[Required]
public int Rate { get; set; }
public Book Books { get; set; }
[Required]
public int BookId { get; set; }
}
一本书可以有很多评分。我需要编写一个查询 我可以查看每本书的BookTitle,作者,描述和平均评分。我知道我可以使用View Model但我不知道如何构建 LINQ查询
和帮助将不胜感激
答案 0 :(得分:1)
一种方法是在Book
上设置导航属性:
public class Book
{
public ICollection<Rating> Ratings { get; set; }
}
然后,使用Linq,您可以使用引用属性:
_context.Books.Select( c => new
{
c.BookTitle,
c.Author,
c.Description,
c.Ratings.Select( e => e.Rate ).Sum() / c.Ratings.Count()
});
如果使用Entity Framework中的DbContext
,则会转换为SQL查询。
答案 1 :(得分:1)
让我们首先介绍一个viewModel类:
public class BookViewModel
{
public string BookTitle { get; set; }
public string Author { get; set; }
public string Description { get; set; }
public double AvgRating { get; set; }
}
我们可以执行以下LINQ。
var bookViewModels = context.Books.GroupJoin(context.Ratings, x => x.Id, y => y.BookId,
(book, rates) => new BookViewModel
{
Author = book.Author,
BookTitle = book.BookTitle,
Description = book.Description,
AvgRating = rates.Average(r => r.Rate)
});
您可能更容易在Ratings
课程中拥有Book
导航属性。