Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET MVC中的LINQ:创建ViewModel与连接表相比有什么优势吗?_C#_Linq_Select_Viewmodel_Asp.net Mvc Viewmodel - Fatal编程技术网

C# NET MVC中的LINQ:创建ViewModel与连接表相比有什么优势吗?

C# NET MVC中的LINQ:创建ViewModel与连接表相比有什么优势吗?,c#,linq,select,viewmodel,asp.net-mvc-viewmodel,C#,Linq,Select,Viewmodel,Asp.net Mvc Viewmodel,我正在做一个简单的项目,其中有两个表中的数据,需要从控制器返回到视图。我知道在.NET中有两种方法可以做到这一点,第一种是创建一个模型类,添加需要在视图中访问的属性,本质上是创建一个ViewModel。像这样: public class BeerListViewModel { public int Id { get; set; } public string Name { get; set; } public string BrewerName { get; se

我正在做一个简单的项目,其中有两个表中的数据,需要从控制器返回到视图。我知道在.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,并使用需要发送到视图的属性加载它,然后将您的模型返回到视图,如下所示:

//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查询中连接两个表,选择需要发送到匿名对象中的视图的属性并返回视图,如下所示:

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.创建将传递匿名类型的控制器

    public ActionResult Index()
    {
        return View(new { TestProperties="This is a test properties."});
    }
二,。检查是否在视图中发送数据

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

@Model.TestProperties
访问匿名类型的属性时,我们将遇到以下错误:

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

  • 为ViewModel创建POCO类。
  • 访问ViewModel的属性

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

    我明白你的意思,以前去过,但试着这样想。。。。也许有帮助,也许没有。在ViewModel中包含DB类,而不是为每个属性创建ViewModel属性。这样,视图模型只是一个容器。您的db访问应该是分层的,即不在控制器中…无论如何。。假设在视图中显示“啤酒”创建视图模型啤酒IndexviewModel包含属性列表啤酒填充时,告诉EF“包含”评论。然后你的任务完成了。以上这些都不是你的错,这里已经有答案了。这看起来是多余的,但最终这带来了这里提到的多个优点。有用的元反馈:我刚刚在这里标记了一条评论,关于投票否决是网络欺凌的一个例子,它会自动删除(有一个未发布的算法,意味着一些评论在标记时会自动删除)。我还从另一个问题中删除了一些关于投票和语气的元评论。一般来说,如果您对堆栈溢出有强烈的预期,最好不要事先对其进行评论。这主要是因为这样做可能会矛盾地导致强烈的反应,因此它会引发你试图避免的事情。这是不幸的,但试图控制这种人类现象可能是徒劳的。在任何情况下,我们都希望帖子不要带有不相关的元评论——Stack Overflow的大多数读者没有账户,也没有登录,他们只想阅读简洁明了的材料。在发布问题时,从心理学的角度来看,对任何形式的投票持开放态度是非常有帮助的,包括近距离投票和向下投票。有人花时间帮助策划网站的这些行动通常是值得称赞的——这就是为什么Stack Overflow被认为是目前世界上质量最高的科技问答网站之一。大体上,我认为不支持投票的人不值得评论——他们是匿名的,所以问他们为什么这样做是不值得的,因为选民已经离开了。如果他们想提供评论反馈,他们会这样做的。