我对网络表格的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
相同。
答案 0 :(得分:5)
m
和s
都是隐式输入的。由于您从m
中选择了movies
,因此您无需告诉LINQ m
是什么。它可以通过查看db.Movies
是什么的集合来暗示类型。因此,如果db.Movies
为IEnumerable<Movie>
(例如),则m
将为Movie
。
如果你真的想要,你没有什么可以阻止你指定类型,所以你可以输入:
var movies = from Movie m in db.Movies
select m;
但你很少需要。
请注意,您也隐式输入movies
,这是相同的概念。只要编译器能够明确地弄清楚类型应该是什么。
答案 1 :(得分:4)
变量m
和s
是Movie
&#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)
变量m
和s
使用var
关键字,这意味着您不必明确提及变量的类型。编译器会为您解决这个问题。它基本上是IEnumerable
类型的变量。
如果您无法明确定义var
的返回类型,movies
关键字通常非常有用,如下所示 -
var movies = from m in db.Movies
select new { m.Attr1, m.Attr2 } ;
因为,new
中的条款是另一个匿名的&#39;对象未在任何地方指定,您需要var
关键字。