LINQ trả về cái gì khi kết quả trống


319

Tôi có một câu hỏi về truy vấn LINQ. Thông thường một truy vấn trả về một IEnumerable<T>loại. Nếu trả về là trống, không chắc nó có null hay không. Tôi không chắc chắn nếu sau đây ToList()sẽ ném một ngoại lệ hoặc chỉ là một sản phẩm trống List<string>nếu không tìm thấy IEnumerablekết quả?

   List<string> list = {"a"};
   // is the result null or something else?
   IEnumerable<string> ilist = from x in list where x == "ABC" select x;
   // Or directly to a list, exception thrown?
   List<string> list1 = (from x in list where x == "ABC" select x).ToList();

Tôi biết đó là một câu hỏi rất đơn giản, nhưng hiện tại tôi không có sẵn VS.


11
Tôi đoán kết quả là En đếmable.Empty?
David.Chu.ca

Câu trả lời:


512

Nó sẽ trả về một vô số trống rỗng. Nó sẽ không có giá trị. Bạn có thể ngủ âm thanh :)


38

Bạn cũng có thể kiểm tra .Any()phương pháp:

if (!YourResult.Any())

Chỉ cần một lưu ý rằng .Anyvẫn sẽ lấy các bản ghi từ cơ sở dữ liệu; thực hiện một .FirstOrDefault()/.Where()sẽ chỉ là quá nhiều chi phí nhưng sau đó bạn sẽ có thể bắt (các) đối tượng được trả về từ truy vấn


5
Trường hợp câu hỏi đề cập đến một cơ sở dữ liệu?
cja

4
Bạn sẽ phải hỏi người đã chỉnh sửa, tôi đã không đề cập đến bất kỳ DB nào :)
Noich

Trình chỉnh sửa điểm đang tạo ra là âm thanh, mặc dù, DB hay không. Tôi tin rằng họ đang nói .Any()sẽ chỉ cho bạn biết nếu bạn có bất kỳ hồ sơ phù hợp nào, khi thực hiện một truy vấn thực tế để tìm một giá trị cụ thể có thể là null khi .Any()không.
vapcguy

1
Chỉnh sửa thực sự có thể sai. Nếu sử dụng linq cho các thực thể, db có thể tắt phím này và không có dữ liệu nào được gửi đến máy khách ngoại trừ đúng hoặc sai
Mafii

19
var lst = new List<int>() { 1, 2, 3 };
var ans = lst.Where( i => i > 3 );

(ans == null).Dump();  // False
(ans.Count() == 0 ).Dump();  // True

(Kết xuất từ LinqPad )


Chính xác! Bạn nhận được một dấu hiệu tốt hơn về những phát hiện
chiếu vào

TIL Count()cũng là một phương thức, không chỉ là tài sản
heyNow 18/8/2016

2
Bạn không nên sử dụng .Any () vì số lượng sẽ liệt kê qua tất cả các mục?
SHEePYTaGGeRNeP


8

Trong Linq-to-SQL nếu bạn cố lấy phần tử đầu tiên trên truy vấn mà không có kết quả, bạn sẽ gặp sequence contains no elementslỗi. Tôi có thể đảm bảo với bạn rằng lỗi được đề cập không bằng object reference not set to an instance of an object. kết luận là không, nó sẽ không trả về null vì null không thể nói sequence contains no elementsnó sẽ luôn luôn nói object reference not set to an instance of an object;)


1
Oh, giải thích của bạn giúp hiểu thêm. Cảm ơn bạn !
Kay Lee

Điều này có trả lời câu hỏi không?
ChiefTwoP Pencil

7

Các bài đăng khác ở đây đã làm rõ rằng kết quả là một IQueryable "trống", mà ToList () sẽ thay đổi chính xác thành một danh sách trống, v.v.

Hãy cẩn thận với một số toán tử, vì họ sẽ ném nếu bạn gửi cho họ vô số trống. Điều này có thể xảy ra khi bạn xâu chuỗi chúng lại với nhau.


3
"Hãy cẩn thận với một số toán tử, vì họ sẽ ném nếu bạn gửi cho họ vô số trống. Điều này có thể xảy ra khi bạn xâu chuỗi chúng lại với nhau." - Đây là những gì đã cho tôi. Tôi đã có một giá trị trả về null mà sau đó tôi đưa vào một truy vấn khác. Điều này khiến cho truy vấn thứ hai bị ném bất kể tôi đưa ra câu hỏi nào vì không có giá trị nào được đưa vào truy vấn thứ hai.
trevorc

6

Nó sẽ không ném ngoại lệ, bạn sẽ nhận được một danh sách trống.

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.