簡體   English   中英

需要幫助了解MVC中的LINQ?

[英]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相同。

ms都是隱式輸入的。 由於您是從movies中選擇m ,因此您無需告訴LINQ m是什么。 它可以通過查看db.Movies是什么的集合來暗示類型。 因此,如果db.MoviesIEnumerable<Movie> (例如),那么m將是一個Movie

如果你真的想要,沒有什么可以阻止你指定類型,所以你可以輸入:

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

但你很少需要。

請注意,您也隱式輸入movies ,這是相同的概念。 只要編譯器能夠明確地弄清楚類型應該是什么。

變量msdb.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'

變量ms使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM