Using COALESCE() in Linq-To-SQL
I had a situation today where I wanted to return a user’s name using Linq. Sure, I could have easily written some code for this, but for the sake of keeping my code simple and readable I wanted Linq to handle the building of the name.
Users Table
| UserID | FirstName | LastName |
|---|---|---|
| 1 | David | Andrews |
| 2 | Bob | NULL |
The Linq seemed easy:
1 2 3 4 5 6 7 8 9 10 | public static string GetNameOfUser(int userID) { DatabaseDataContext dc = new DatabaseDataContext(); var user = from u in dc.Users where u.UserID == userID select u.FirstName + " " + u.LastName; return (user.Count() == 0) ? "Unknown User" : user.First(); } |
However my results were not correct. Bob was left out because he did not have a last name value (it’s NULL in the database.) You will get results like this if you run that for each user (one at a time, but I put them in a table here.)
Results
| Expected | Value Received |
|---|---|
| David Andrews | David Andrews |
| Bob | <Empty String> |
In SQL it is very common to use the COALESCE() function to handle problems with null values. But how can I do that in Linq? I didn’t want to write extra code to check for nulls and concatenate the values myself.
The answer is simple: ??. Yes, that’s right. Two question marks is the “coalesce” operator in Linq. It’s a good idea to wrap what you are testing in coalesce inside parenthesis as well.
What follows is my new function.
1 2 3 4 5 6 7 8 9 10 | public static string GetNameOfUser(int userID) { DatabaseDataContext dc = new DatabaseDataContext(); var user = from u in dc.Users where u.UserID == userID select (u.FirstName ?? "") + " " + (u.LastName ?? ""); return (user.Count() == 0) ? "Unknown User" : user.First(); } |
As you can see, I’ve added ?? “” after both FirstName and LastName. This translates to:
coalesce(FirstName, ”)
coalesce(LastName, ”)
Which means that if FirstName is null you will get ”, which adds correctly in SQL to another string. Same goes for LastName.
Here are my new results:
Results
| Expected | Value Received |
|---|---|
| David Andrews | David Andrews |
| Bob | Bob |
Follow Dave on Twitter

Solved my problem exactly. I was using the ?? but I needed the parentheses.
Glad I could help! The parenthesis came about because it didn’t work exactly as I thought it would. I guess they just help Linq along a little with its parsing.