2011-10-19 27 views
28

Tôi chỉ muốn biết cách tốt nhất để kiểm tra xem kết quả IQueryable có không có giá trị không.Cách tốt nhất để kiểm tra tập kết quả IQueryable là null

ví dụ: nếu chúng ta có một phương pháp như

public static IQueryable<Table> DisplayAll() 
{ 
    var db = new DataContext(); 
    var list= from data in db.Table select data; 
    return list; 
} 

và sau đó chúng tôi làm điều gì đó như thế này

var list = DisplayAll(); 
if(list != null) 
{ 
    //do something --- in here even if the result set has no values it will 
    // go to this line. It just say `enumeration yielded no results` 
} 

Bất kỳ cách nào có thể kiểm tra các tập kết quả có nội dung hay không ??

Cảm ơn

Trả lời

62

list sẽ không bao giờ null với LINQ; nó sẽ đại diện cho một "bộ sưu tập rỗng" nếu cần thiết. Cách kiểm tra là phương pháp mở rộng Any:

if (list.Any()) { 
    // list has at least one item 
} 
+0

đủ đơn giản. Cảm ơn bạn –

+0

Nhưng không có một ToList() điều này có thể rất tốn kém. –

+3

@HenkHolterman: Tại sao? Tôi muốn đặt cược tiền tốt trong ví dụ cụ thể này, 'Any()' sẽ dẫn đến 'SELECT COUNT (*) ...' và so sánh số nguyên. Ngay cả khi nó đi theo con đường ngớ ngẩn bắt đầu liệt kê một tập kết quả, làm thế nào 'ToList' sẽ nhanh hơn? – Jon

1

Một ngoại lệ sẽ bị hủy nếu không thể kết quả. Tôi sử dụng:

using System.Data.Entity; //for Async support in EF 
var tQ = await _tableRepository.DisplayAll(); 
try { return await tQ.ToListAsync(); } 
catch { return null; } 

để bẫy ngoại lệ và trả về giá trị rỗng; hoặc một danh sách rỗng nếu bạn thích,

catch { return new List<Table>(); } 
-2

Đây là những gì làm việc cho tôi:

public IQueryable SomeFunc() 
    { 
     IQueryable result = Repo.SomeLinqQuery(); 
     if (result.GetEnumerator().MoveNext() == false) 
     { 
      throw new Exception("Results empty"); 
     } 
     return result; 
    } 
+1

lý do tại sao bạn thực sự cần phải làm điều này? –

+1

thủ dâm não;) Thật thú vị cách xa người ta có thể làm phức tạp một vấn đề đơn giản. – Jerther

+1

Phần này là tốt mặc dù: result.GetEnumerator(). MoveNext() == false – cfnerd

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