2012-02-23 28 views
5

Tôi có một iQueryable và tôi cần phải biết nếu nó là null hoặc không có giá trị.Cách tốt nhất để xác định null hoặc đếm 0

IQueryable<people> L = (from p in people 
         where p.lastname.Contains("y") 
         select p); 
if (L != null && L.Count() > 0) { 
    return "Something"; 
} else { 
    return "NOTHING"; 
} 

Nếu bạn sử dụng L.Count(), nó sẽ sử dụng nhiều tài nguyên hơn. Có cách nào tốt hơn? Nội dung nào đó không sử dụng L.Count()

+3

Nếu bạn gọi 'SingleOrDefault', làm cách nào để 'L' là' IQueryable '? – dtb

+0

Bạn đúng, tôi không có '.SingleOrDefault' trong mã của tôi. Vui lòng chỉnh sửa điều đó trong tâm trí của bạn. – Kramer

+1

Bạn có thể chỉnh sửa câu hỏi của mình bằng cách nhấp vào liên kết [chỉnh sửa] (http://stackoverflow.com/posts/9414805/edit) bên dưới câu hỏi của bạn. – dtb

Trả lời

4

Bạn nên sử dụng .Any().

IQueryable<people> L = (from p in people 
         where p.lastname.Contains("y") 
         select p); 
if (L.Any()) { 
    return "Something"; 
} else { 
    return "NOTHING"; 
} 
+0

Chúng tôi đã so sánh mã và '.Count' so với' .Any' gần như giống nhau. Nhưng tôi thích '.Any' tốt hơn. Tôi đã không kiểm tra cách SQL giao dịch với nó nhưng tôi có thể làm điều đó sau. Cảm ơn! – Kramer

+0

Trong trường hợp số đếm trống hoặc chỉ có một hoặc hai giá trị, HOẶC trong đó phương pháp được áp dụng trực tiếp cho nguồn IEnumerable cũng có thể nhận dạng dưới dạng ICollection hoặc Array (và do đó có thuộc tính Count hoặc Length), Count() sẽ thực hiện gần giống như Any(). Nơi nào() thực sự tỏa sáng là trong các bộ sưu tập dài; Bất kỳ() thực hiện liên tục (O (1)), trong khi Count() thực hiện tuyến tính (O (N)). Cả hai đều "nhanh" bởi hầu hết các biện pháp thuật toán, nhưng Any() nhanh hơn. – KeithS

+0

LINQ to SQL, Entity Framework và các nhà cung cấp NHibernate gần đây đều xử lý 'Any' theo cách đặc biệt, hiệu quả. Bạn có thể xem một ví dụ về những gì nó tạo ra bằng cách sử dụng LINQPad. Tuyệt đấy. – HackedByChinese

1

L.Any(), L.FirstOrDefault() sẽ khá nhiều cả hai đều có hiệu năng giống như họ có thực hiện gần như giống hệt nhau và có lẽ là những gì bạn đang tìm kiếm. SingleOrDefault của bạn có lẽ không chủ ý vì nó sẽ ném một ngoại lệ nếu có nhiều hơn một kết quả.

Performance of LINQ Any vs FirstOrDefault != null

Điều đáng nói là một số điều này tùy thuộc vào nhà cung cấp của bạn. IQueryable chỉ ngụ ý một ý định. Nếu đó là Linq2Sql hoặc một cái gì đó sau đó có L.Count() sẽ yêu cầu thêm tài nguyên - ngoại trừ việc bạn cũng gọi OneOrDefault trong dòng trên có nghĩa là kiểm tra null của bạn là tất cả ... Điện thoại

Nếu tôi chạy tuyên bố này đối với nhà cung cấp LINQ, tôi viết bản thân mình (hoặc Amazons, hoặc bất kỳ nhà cung cấp LINQ nào khác) .Count() có thể nhanh hơn tùy thuộc vào nhà cung cấp đang làm gì, nhưng giả định của bạn bằng cách sử dụng Microsoft Linq để triển khai SQL thông thường.

1

Một ví dụ của việc sử dụng phương pháp Bất cứ

return people.Any(p => p.lastname.Contains("y")) ? "something" : "nothing"; 

Đây là một ví dụ mà sẽ trả về một IQueryable nếu Bất cứ trả về true, tuy nhiên nó có thể là quá ineffecient vì nó đòi hỏi phải có hai chuyến đi vòng đến cơ sở dữ liệu . Tôi chắc chắn một phương pháp tốt hơn có thể được viết, cho đủ thời gian và suy nghĩ.

 return sis.Students.Any(p => p.LastName.Contains("y")) ? 
     people.Where(p => p.lastname.Contains("y")) : "nothing"; 
3

L có cần IQueryable <>?
Bằng cách sử dụng SingleOrDefault() nó sẽ là một người độc thân (Person?) Hoặc null (giả sử người là một lớp)

var result = (from p in people 
       where p.lastname.Contains("y") 
       select p).SingleOrDefault(); 

return result == null 
     ? "NOTHING" 
     : "Something"; 

khác: là SingleOrDefault() những gì bạn muốn sử dụng hoặc làm bạn có ý nghĩa FirstOrDefault() hoặc bạn có nghĩa là Any()?

Có thể LINQ: When to use SingleOrDefault vs. FirstOrDefault() with filtering criteria có thể trợ giúp.

hth,
Alan.

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