[英]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.