需要帮助了解MVC中的LINQ?

时间:2015-04-23 13:22:29

标签: c# asp.net-mvc linq

我对网络表格的MVC很新,对我来说这是一个非常非常陡峭的学习曲线。以下是我正在遵循的教程中的功能:

public ActionResult Index(string id)
{
    string searchString = id;
    var movies = from m in db.Movies
                 select m;
    if (!String.IsNullOrEmpty(searchString))
    {
        movies = movies.Where(s => s.Title.Contains(searchString));
    }
    return View(movies);
}

以下是我认为我知道正在发生的事情。该方法是一个Action结果(没有参数)返回一个视图。添加参数以告诉应用程序查找“id”字符串。

我发现lambda语句更容易理解。 if正在检查searchString是否为null,否则返回与searchString中的描述匹配的电影。

但是,在方法中,searchString在参数中的值为id。这是我开始迷路的地方,在定义searchString之后,LINQ语句放在变量movies中。在该声明中,m的目的是什么?为什么没有定义或是什么?与lambda中的s相同。

5 个答案:

答案 0 :(得分:5)

ms都是隐式输入的。由于您从m中选择了movies,因此您无需告诉LINQ m是什么。它可以通过查看db.Movies是什么的集合来暗示类型。因此,如果db.MoviesIEnumerable<Movie>(例如),则m将为Movie

如果你真的想要,你没有什么可以阻止你指定类型,所以你可以输入:

 var movies = from Movie m in db.Movies
             select m;

但你很少需要。

请注意,您也隐式输入movies,这是相同的概念。只要编译器能够明确地弄清楚类型应该是什么。

答案 1 :(得分:4)

变量msMovie&#34;集合&#34;中db.Movies的每个实例的变量。 (我假设这个类叫做什么)。

从概念上讲,它们类似于在以下sql中使用和sql别名m

select m.* from Movies m

当您稍后应用where条款时,您在概念上最终会以:

select * from (
    select m.* from Movies m
) s
where s.Title like '%' + searchString + '%'

请注意,这不是sql在对数据库运行时实际结束的方式,只是一种有助于理解的表示。

如果您查看movies的值,那么您会看到它是IQueryable或类似的。这意味着它还没有实际执行 - 你还没有返回任何东西。因此,稍后添加where子句很好 - 它只会添加到稍后运行的查询中。

答案 2 :(得分:1)

var movies = from m in db.Movies select m大致翻译为“获取db.Movies中的所有项目并暂时将其命名为m,然后将其返回到IEnumerable中”。实际上,您会看到movies的类型为IEnumerable<Movie>

同样适用于movies = movies.Where(s => s.Title.Contains(searchString));:对于电影中的所有项目,请暂时将其命名为s,并将Title包含searchString的{​​{1}}作为IEnumerable

我希望它变得更加清晰。

答案 3 :(得分:1)

好的 - 我会尝试解释发生了什么:

with:

var movies = from m in db.Movies select m;

您正在描述一种处理集合的方法db.Movies&#39; (不管是什么......)

用描述性语言:

1)in dbo.Movies我们将检查/循环db.Movies中的所有内容。

2)from m当我们回过头来看时,我们会将我们遇到的每件事都存储在一个名为“m&#39; m&#39;进一步用于表达。

3)select m好的 - 我们希望这个查询/表达式实际返回一些东西 - 实际上产生一些结果 - 所以,让1-by-1只返回&#39; m&#39;我们之前宣布

答案 4 :(得分:0)

变量ms使用var关键字,这意味着您不必明确提及变量的类型。编译器会为您解决这个问题。它基本上是IEnumerable类型的变量。

如果您无法明确定义var的返回类型,movies关键字通常非常有用,如下所示 -

var movies = from m in db.Movies
             select new { m.Attr1, m.Attr2 } ;

因为,new中的条款是另一个匿名的&#39;对象未在任何地方指定,您需要var关键字。