Đó là Linq hay Lambda?


105

Tôi biết rằng đây là Linq:

var _Results = from item in _List
                where item.Value == 1
                select item;

Và tôi biết đây là Lambda:

var _Results = _List.Where(x => x.Value == 1);

Lưu ý của người biên tập: ở trên không chỉ đơn thuần là Lambda, nó là Linq sử dụng "Cú pháp phương thức" có vị từ là Lambda. Để rõ ràng, cả hai mẫu trên đều là Linq (bài gốc của tôi không chính xác, nhưng tôi đã để lại lỗi để minh họa cho sự nhầm lẫn dẫn đến câu hỏi).

Nhưng Linq có phải là một tập hợp con của Lambda hay không?

Tại sao có hai công nghệ dường như giống hệt nhau?

Có lý do kỹ thuật nào để chọn cái này hơn cái kia không?


Câu trả lời:


135

Đây là LINQ (sử dụng cú pháp truy vấn):

var _Results = from item in _List
                where item.Value == 1
                select item;

Đây cũng là LINQ (sử dụng cú pháp phương thức):

var _Results = _List.Where(x => x.Value == 1);

Thật thú vị khi lưu ý rằng cả hai hương vị này sẽ tạo ra cùng một mã chính xác. Trình biên dịch cung cấp cho bạn một dịch vụ bằng cách cho phép bạn thể hiện mong muốn của mình theo cách bạn thích.

đây là một lambda:

x => x.Value == 1

Khi bạn chọn sử dụng cú pháp phương thức, LINQ hầu như luôn được nhìn thấy xung quanh các biểu thức lambda. Nhưng LINQlambdas là hai thứ hoàn toàn khác nhau, cả hai đều có thể tự sử dụng.

Cập nhật: Như svick đã chỉ ra đúng, LINQ với cú pháp truy vấn cũng được triển khai bằng cách sử dụng biểu thức lambda (như đã đề cập trước đó, trình biên dịch cho phép bạn viết bằng cú pháp truy vấn nhưng hiệu quả chuyển nó thành cú pháp phương thức sau lưng bạn). Đây chỉ là một thực tế là cả hai hương vị hoàn toàn tương đương và sẽ hoạt động theo cùng một cách (ví dụ: biểu thức lambda có thể tạo ra các bao đóng ).


2
Tôi nghĩ điều đáng nói là cú pháp truy vấn cũng sử dụng lambdas đằng sau hậu trường. Điều này có thể quan trọng vì đóng cửa.
svick

34

Cả hai đều là Linq. Cái thứ hai là sử dụng Lambdas .

Lambdas là kiểu phương thức nội tuyến mà bạn đang truyền dưới dạng tham số cho hàm Where trong ví dụ thứ hai.

Sự khác biệt giữa hai cú pháp đó hoàn toàn là cú pháp. Kiểu linq thứ hai sử dụng các cuộc gọi phương thức là cách nó hoạt động dưới mui xe. Đầu tiên có nghĩa là thân thiện hơn / dễ dàng hơn và trình biên dịch chuyển đổi nó thành các cuộc gọi phương thức đằng sau hậu trường. Chúng sẽ hoạt động giống nhau đối với bất kỳ truy vấn nhất định nào mặc dù tất nhiên trình biên dịch có thể chọn một cách diễn giải tương tự cho một truy vấn linq phức tạp so với khi bạn chuyển đổi sang kiểu phương thức.

Bài viết trên msdn này cũng có thể được quan tâm: Cú pháp truy vấn LINQ so với Cú pháp phương thức . Mức độ liên quan cụ thể là: "Nói chung, chúng tôi khuyên bạn nên dùng cú pháp truy vấn vì nó thường đơn giản hơn và dễ đọc hơn; tuy nhiên không có sự khác biệt về ngữ nghĩa giữa cú pháp phương thức và cú pháp truy vấn."


6
Cá nhân tôi thấy cú pháp phương thức dễ đọc hơn - có lẽ bởi vì hầu hết mã của tôi thuộc loại "LINQ to Objects". Nhưng nếu bạn có nhiều kinh nghiệm về SQL, có lẽ ban đầu cú pháp truy vấn sẽ dễ hiểu hơn.
Tom Bushell,

@Tom Bushell, ngay cả cú pháp THAM GIA? Nghiêm túc?
Jerry Nixon

@Tom Bushell: tôi cũng vậy. Tôi đã diễn giải một cái gì đó trên trang MSDN đó có lẽ giải thích tại sao họ bận tâm phát triển cú pháp đó hơn là chỉ có kiểu phương thức. Tôi thường chỉ làm những thứ tương đối cơ bản hơn là nối hoặc bất kỳ thứ gì khác phức tạp hơn (tức là chủ yếu là lọc hoặc các hoạt động ánh xạ 1-1).
Chris

@Jerry - giống như Chris, công việc LINQ của tôi cho đến nay khá đơn giản. Tôi đã đọc rằng Cú pháp truy vấn thường thích hợp hơn khi thực hiện SelectMany, Join hoặc GroupJoin - tôi chỉ chưa cần làm bất cứ điều gì như vậy - chưa!
Tom Bushell

1
Trong nội bộ "cú pháp truy vấn" được gọi trong nhóm LINQ tới SQL và LINQ tới Thực thể là "cú pháp hiểu".
DamienG
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.