2015-04-23 17 views
8

Tôi khá mới với MVC từ biểu mẫu web và nó đã là một đường cong học tập thực sự, thực sự dốc đối với tôi. Đây là chức năng trong hướng dẫn mà tôi đang theo dõi:Bạn cần trợ giúp để hiểu LINQ trong 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); 
} 

Đây là những gì tôi nghĩ rằng tôi biết điều đó đang xảy ra. Phương thức là kết quả Hành động (không có tham số) trả về một khung nhìn. Các tham số được thêm vào để cho ứng dụng tìm kiếm một chuỗi "id".

Tôi tìm thấy tuyên bố lambda dễ hiểu hơn một chút. Các if đang kiểm tra xem nếu searchString là null nếu không nó trả về bộ phim phù hợp với mô tả trong searchString.

Tuy nhiên, trong phương pháp, searchString được cung cấp giá trị id trong thông số. Đây là nơi tôi bắt đầu bị lạc, ngay sau khi searchString được định nghĩa, một câu lệnh LINQ được đặt bên trong biến movies. Trong tuyên bố đó, mục đích của m là gì? Tại sao nó không được xác định hoặc là nó? Tương tự với s trong lambda.

+0

Tôi tin rằng nó tương đương với 'var movies = db.Movies.Select (m => m)', ít nhất là (không hợp lý) (nhưng nó phụ thuộc vào nhà cung cấp LINQ, tôi đoán là). Về cơ bản, toàn bộ điều này nói: "Chọn tất cả các phim, trừ khi có chuỗi tìm kiếm - trong trường hợp đó, chỉ giữ phim chứa chuỗi tìm kiếm đó". –

+0

@ TheodorosChatzigiannakis những gì tôi hiểu trong nhận xét của bạn là Chọn từ Phim trong đó m lớn hơn hoặc bằng m .... Tôi đoán m cũng được xác định một phần bởi searchString. chính xác? Bạn có ý nghĩa gì bởi no-op? – Skullomania

+0

@TheodorosChatzigiannakis đó là một thiết lập để có được đúng loại cho 'var'. 'db.Movies' rất có thể là một' DbSet <> 'mà sẽ không cho phép thêm vào đâu. – Johnbot

Trả lời

5

Cả hai ms được nhập hoàn toàn. Vì bạn đang chọn m từ movies, bạn không cần phải cho LINQ biết số m là gì. Nó có thể ngụ ý loại bằng cách nhìn vào những gì db.Movies là một bộ sưu tập. Vì vậy, nếu db.MoviesIEnumerable<Movie> (ví dụ) thì m sẽ là Movie.

Không có gì để ngăn chặn bạn xác định kiểu là nếu bạn thực sự muốn, vì vậy bạn có thể gõ:

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

Nhưng bạn hiếm khi cần.

Lưu ý bạn cũng đang nhập hoàn toàn movies, đó là khái niệm tương tự. Vì vậy, miễn là trình biên dịch có thể rõ ràng những gì loại nên được.

1

var movies = from m in db.Movies select m dịch gần như "Lấy tất cả các mục trong db.Movies và đặt tên chúng tạm thời m, sau đó trả lại chúng trong IEnumerable". Thật vậy, bạn sẽ thấy rằng movies là loại IEnumerable<Movie>.

Cũng vậy với movies = movies.Where(s => s.Title.Contains(searchString));: Đối với tất cả các mục trong phim, đặt tên cho họ tạm thời s và gửi lại những người có Title chứa của bạn searchString như một IEnumerable.

Tôi hy vọng nó trở nên rõ ràng hơn một chút.

4

Các biến ms là các biến cho mỗi trường hợp của Movie trong "bộ sưu tập" db.Movies (tôi giả sử đó là những gì các lớp được gọi là).

Về mặt lý thuyết này cũng tương tự như việc sử dụng và sql alias m trong sql sau:

select m.* from Movies m 

Khi bạn sau đó áp dụng các where khoản bạn đang khái niệm kết thúc với:

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

Chú ý rằng đây không phải là làm thế nào sql thực sự kết thúc khi nó chạy với cơ sở dữ liệu, chỉ là một đại diện để hỗ trợ sự hiểu biết.

Nếu bạn nhìn vào giá trị movies thì bạn sẽ thấy rằng đó là IQueryable hoặc tương tự. Điều này có nghĩa là nó chưa thực sự được thực hiện - bạn đã không trả lại bất cứ điều gì. Vì vậy, thêm mệnh đề where sau đó là tốt - nó chỉ được thêm vào truy vấn sẽ chạy sau này.

1

Ok - Tôi sẽ cố gắng giải thích những gì đang xảy ra:

với:

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

Bạn đang mô tả một cách để xử lý các bộ sưu tập 'db.Movies' (bất kể đó là ...)

trong ngôn ngữ mô tả:

1) in dbo.Movies Chúng ta sẽ được kiểm tra/Looping trên tất cả mọi thứ mọi thứ trong db.Movies.

2) from m Khi chúng ta xem xét chúng, chúng tôi sẽ lưu trữ từng điều chúng ta gặp trong một biến gọi là 'm' để sử dụng thêm trong biểu thức.

3) select m Ok - chúng ta muốn truy vấn này/biểu thức để thực sự trở lại một cái gì đó - để thực sự mang lại một số kết quả - vì vậy, cho phép 1-by-1 chỉ trả lại 'm' chúng tôi đã tuyên bố trước đó

0

Các biến ms đang sử dụng các từ khóa var có nghĩa là bạn không phải đề cập rõ ràng loại biến. Trình biên dịch con số nó ra cho bạn. Về cơ bản nó là một biến của loại IEnumerable.

Từ khóa var nói chung là hữu ích trong những điều sau đây khi bạn không thể xác định rõ kiểu dữ liệu trở lại của movies như liệt kê dưới đây

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

Kể từ, mệnh đề trong new là một 'vô danh' đối tượng không quy định bất cứ nơi nào, bạn cần từ khóa var.

Các vấn đề liên quan