David.Chu.ca
David.Chu.ca

Reputation: 38634

What does LINQ return when the results are empty

I have a question about LINQ query. Normally a query returns a IEnumerable<T> type. If the return is empty, not sure if it is null or not. I am not sure if the following ToList() will throw an exception or just a empty List<string> if nothing found in IEnumerable result?

   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();

I know it is a very simple question, but I don't have VS available for the time being.

Upvotes: 407

Views: 274166

Answers (7)

leppie
leppie

Reputation: 117220

It will return an empty enumerable. It won't be null. You can sleep sound :)

Upvotes: 680

Spence
Spence

Reputation: 29322

Other posts here have made it clear that the result is an "empty" IQueryable, which ToList() will correctly change to be an empty list etc.

Do be careful with some of the operators, as they will throw if you send them an empty enumerable. This can happen when you chain them together.

Upvotes: 8

Paul van Brenk
Paul van Brenk

Reputation: 7549

.ToList returns an empty list. (same as new List<T>() );

Upvotes: 19

kay.one
kay.one

Reputation: 7692

In Linq-to-SQL if you try to get the first element on a query with no results you will get sequence contains no elements error. I can assure you that the mentioned error is not equal to object reference not set to an instance of an object. in conclusion no, it won't return null since null can't say sequence contains no elements it will always say object reference not set to an instance of an object ;)

Upvotes: 9

Noich
Noich

Reputation: 15441

You can also check the .Any() method:

if (!YourResult.Any())

Just a note that .Any will still retrieve the records from the database; doing a .FirstOrDefault()/.Where() will be just as much overhead but you would then be able to catch the object(s) returned from the query

Upvotes: 52

JP Alioto
JP Alioto

Reputation: 45117

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

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

(Dump is from LinqPad)

Upvotes: 25

Jimmy Chandra
Jimmy Chandra

Reputation: 6580

It won't throw exception, you'll get an empty list.

Upvotes: 8

Related Questions