2013-04-24 72 views
9

Tôi đang sử dụng Entity Framework trong ASP.NET, C#, ứng dụng web của mình. Nếu tôi cần chọn một bản ghi từ DataBase (trong Lớp Truy cập Dữ liệu), tôi nên sử dụng phương pháp nào? Truy vấn LINQ hoặc Biểu thức Lambda?Truy vấn LINQ hoặc biểu thức Lambda?

Ví dụ: -

//Linq   
var result = from a in db.myTable.Take(1) where a.Id == varId select a; 
return result.First(); 

//Lambda 
return db.myTable.FirstOrDefault(a => a.Id == varId); 

Có cách nào ưa thích trong kịch bản này hoặc bất kỳ lợi thế hơn người kia?

+5

Sử dụng bất kỳ thứ gì bạn muốn. (BTW: họ không làm điều tương tự) – I4V

+1

bản sao có thể có của [LINQ - Cú pháp truy vấn so với chuỗi phương thức & lambda] (http://stackoverflow.com/questions/8037677/linq-query-syntax-vs-method-chains -lambda) – I4V

Trả lời

14

Biểu thức truy vấn biên dịch thành biểu thức phương thức (biểu thức Lambda), vì vậy không có bất kỳ sự khác biệt nào, trong mã của bạn mặc dù bạn đang truy cập FirstFirstOrDefault sẽ hoạt động khác.

Xem: Query Syntax and Method Syntax in LINQ (C#)

LINQ Query Expressions (C# Programming Guide)

Tại thời gian biên dịch, biểu thức truy vấn được chuyển đổi thành tiêu chuẩn Query phương pháp điều hành các cuộc gọi theo các quy tắc được nêu trong đặc điểm kỹ thuật C# . Bất kỳ truy vấn nào có thể được biểu diễn bằng cách sử dụng cú pháp truy vấn cũng có thể được biểu thị bằng cách sử dụng cú pháp phương thức. Tuy nhiên, trong hầu hết các trường hợp, cú pháp truy vấn dễ đọc hơn và ngắn gọn hơn.

+2

+1 cho liên kết msdn –

+0

Điều gì về phân bổ? – dariol

0

Tôi đoán kết quả là như nhau. Lambda chỉ là một chút thoải mái hơn. Nếu bạn cần kết quả chỉ một bảng, biểu thức lambda rất nhanh và dễ đọc.

5

Cú pháp truy vấn LINQ chỉ là đường cú pháp cho phương thức biểu thức. Bất kỳ truy vấn LINQ nào được biên dịch thành các phương thức biểu thức. Btw truy vấn đầu tiên của bạn:

var query = from a in db.myTable.Take(1) 
      where a.Id == varId 
      select a; 
return query.First(); 

là tương đương với

return db.myTable.Take(1).Where(a => a.Id == varId).First(); 
3

Cả hai cố gắng của bạn sử dụng LINQ.

Bản ghi đầu tiên có một bản ghi và kiểm tra xem id có khớp không.

Bản ghi thứ hai lấy bản ghi đầu tiên có id phù hợp.

Đó là sự khác biệt.

0

Mỗi biểu thức truy vấn có thể được biểu diễn dưới dạng C# -code sử dụng lệnh gọi tới toán tử truy vấn dưới dạng phương thức mở rộng. Nhưng điều ngược lại không đúng; chỉ một tập con nhỏ của toán tử truy vấn chuẩn có thể được sử dụng làm từ khóa trong biểu thức truy vấn. Nói cách khác, các biểu thức truy vấn có một số hạn chế mà cơ chế gọi phương thức không có:

  1. Một số toán tử truy vấn đơn giản không có biểu thức truy vấn C# tương đương, ví dụ: ToArray().
  2. Chúng tôi không thể sử dụng tất cả các loại quá tải trong các biểu thức truy vấn của C#. Ví dụ. có một quá tải của Select() đang đợi chỉ mục của đối tượng hiện đang được lặp lại; bạn không thể gọi quá tải này trong biểu thức truy vấn.
  3. Chúng tôi không thể sử dụng câu lệnh lambdas trong biểu thức truy vấn. - Đây là nguyên nhân tại sao đối tượng và bộ khởi tạo bộ sưu tập đã được đưa vào ngôn ngữ C#.
Các vấn đề liên quan