[英]Need help understanding unexpected behavior using LINQ Join with HashSet<T>
[英]Need help understanding LINQ in MVC?
我对网络表格的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
。
但是,在方法中, searchString
在参数中被赋予id
值。 这是我开始迷路的地方,在定义了searchString
之后,LINQ语句放在变量movies
。 在那个声明中, m
的目的是什么? 为什么没有定义或是什么? 与lambda中的s
相同。
m
和s
都是隐式输入的。 由于您是从movies
中选择m
,因此您无需告诉LINQ m
是什么。 它可以通过查看db.Movies
是什么的集合来暗示类型。 因此,如果db.Movies
是IEnumerable<Movie>
(例如),那么m
将是一个Movie
。
如果你真的想要,没有什么可以阻止你指定类型,所以你可以输入:
var movies = from Movie m in db.Movies
select m;
但你很少需要。
请注意,您也隐式输入movies
,这是相同的概念。 只要编译器能够明确地弄清楚类型应该是什么。
变量m
和s
是db.Movies
“集合”中每个Movie
实例的变量(我假设这是类的调用)。
从概念上讲,这些类似于在以下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
稍后添加where
子句很好 - 它只会添加到稍后运行的查询中。
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
那些searchString
作为IEnumerable
。
我希望它变得更加清晰。
好的 - 我会试着解释发生了什么:
有:
var movies = from m in db.Movies select m;
您正在描述处理集合'db.Movies'的方法(无论是什么......)
用描述性语言:
1) in dbo.Movies
我们将检查/循环db.Movies中的所有内容。
2) from m
当我们查看它们时,1-by-1我们将把我们遇到的每个东西存储在一个名为'm'的变量中,以便在表达式中进一步使用。
3) select m
Ok - 我们希望这个查询/表达式实际返回一些东西 - 实际上产生一些结果 - 所以,让1-by-1只返回我们之前声明的'm'
变量m
和s
使用var
关键字,这意味着您不必明确提及变量的类型。 编译器会为您解决这个问题。 它基本上是IEnumerable
类型的变量。
当您无法明确定义movies
的返回类型时, var
关键字在以下情况下通常很有用,如下所示 -
var movies = from m in db.Movies
select new { m.Attr1, m.Attr2 } ;
因为, new
的子句是另一个未在任何地方指定的“匿名”对象,所以需要var
关键字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.