.NET MVC中的LINQ:创建ViewModel与连接表有什么好处?

时间:2017-08-20 01:53:47

标签: c# linq select viewmodel asp.net-mvc-viewmodel

我正在开发一个简单的项目,我在两个表中有数据,我需要从控制器返回到我的View。我知道在.NET中有两种方法可以做到这一点,第一种方法是创建一个模型类,添加你需要在视图中访问的属性,实质上是创建一个ViewModel。像这样:

    public class BeerListViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string BrewerName { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
    public string WebUrl { get; set; }
    public string ImageUrl { get; set; }
    public double AlcoholContent { get; set; }
    public string BeerType { get; set; }
    public int Calories { get; set; }
    public double Carbs { get; set; }
    public string Notes { get; set; }
    public int CountofReviews { get; set; }
}

然后将模型设置为LINQ语句,选择DbSet并实例化ViewModel并使用您需要发送到视图的属性加载它,然后将模型返回到View,如下所示:

//1. Instantiate the db
    OdeToBeerDb _db = new OdeToBeerDb();

    // GET: Reviews
    public ActionResult Index()
    {
        var model = from b in _db.Beers
                    orderby b.Name ascending
                    select new BeerListViewModel
                    {
                        Id = b.Id,
                        Name = b.Name,
                        BrewerName = b.BrewerName,
                        BeerType = b.BeerType,
                        ImageUrl = b.ImageUrl,
                        City = b.City,
                        Notes = b.Notes,
                        AlcoholContent = b.AlcoholContent
                    };

        return View(model);
    }

使用另一种方法,只需在LINQ查询中连接两个表,选择需要发送到匿名对象中的View的属性并返回视图,如下所示:

public class ReviewsController : Controller
{
    //1. Instantiate the db
    OdeToBeerDb _db = new OdeToBeerDb();

    // GET: Reviews
    public ActionResult Index()
    {
        var model = from b in _db.Beers
                    join r in _db.Reviews on b.Id equals r.BeerId
                    orderby b.Name ascending
                    select new
                    {
                        Id = b.Id,
                        Name = b.Name,
                        BrewerName = b.BrewerName,
                        BeerType = b.BeerType,
                        ImageUrl = b.ImageUrl,
                        City = b.City,
                        Notes = b.Notes,
                        AlcoholContent = b.AlcoholContent
                    };

        return View(model);
    }

我想知道的是:为什么我要打扰创建一个ViewModel,将其他类中的属性复制并粘贴到其中,然后实例化ViewModel?与仅加入表格相比,这似乎有点多余,或者是否有一些我缺少的优势?是的,我知道它是强类型的并且创建ViewModel命名对象但是我必须将该属性添加到该类,所以如果我将它们添加到类或控制器中会有什么不同?就此而言,LINQ中是否有一些等同于SELECT *的内容?然后,每次更改模型时,我都不必将属性添加到控制器中。

1 个答案:

答案 0 :(得分:2)

在视图中传递匿名类型时看一些问题:

1.创建一个将传递匿名类型的控制器。

    public ActionResult Index()
    {
        return View(new { TestProperties="This is a test properties."});
    }

2。检查数据是否在视图中发送。

@Model

3。现在,让我们访问我们在视图中发送的匿名类型的属性。

@Model.TestProperties

访问匿名类型的属性我们将遇到此错误: enter image description here

现在让我们为ViewModel创建一个POCO类。

  1. 为ViewModel创建一个POCO类。 enter image description here
  2. 访问ViewModel的属性。
  3. enter image description here

    现在ViewModel的值可以使用Razor语法访问和创建文本框。