使用LINQ从多个表MVC5查看数据

时间:2017-02-19 22:53:38

标签: asp.net-mvc linq mvvm

我有以下两个表

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查询

和帮助将不胜感激

2 个答案:

答案 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导航属性。