It will return an empty enumerable.
LINQ to SQL and LINQ to Entities The problem is the SQL SUM operator which returns NULL for empty sequences. When the result is returned to LINQ to SQL or Entity Framework it fails miserably when trying to assign the NULL value into a non-nullable int .
Try changing your query to this:
db.Leads.Where(l => l.Date.Day == date.Day
&& l.Date.Month == date.Month
&& l.Date.Year == date.Year
&& l.Property.Type == ProtectedPropertyType.Password
&& l.Property.PropertyId == PropertyId)
.Select(l => l.Amount)
.DefaultIfEmpty(0)
.Sum();
This way, your query will only select the Amount
field. If the collection is empty, it will return one element with the value of 0
and then the sum will be applied.
I prefer to use another hack:
double earnings = db.Leads.Where(l => l.Date.Day == date.Day
&& l.Date.Month == date.Month
&& l.Date.Year == date.Year
&& l.Property.Type == ProtectedPropertyType.Password
&& l.Property.PropertyId == PropertyId)
.Sum(l => (double?) l.Amount) ?? 0;
Try this instead, it's shorter:
db.Leads.Where(..).Aggregate(0, (i, lead) => i + lead.Amount);
That's win for me:
int Total = 0;
Total = (int)Db.Logins.Where(L => L.id == item.MyId).Sum(L => (int?)L.NumberOfLogins ?? 0);
In my LOGIN table, in field NUMBEROFLOGINS some values are NULL and others have an INT number. I sum here total NUMBEROFLOGINS of all users of one Corporation (Each Id).
Try:
double earnings = db.Leads.Where(l => l.ShouldBeIncluded).Sum(l => (double?) l.Amount) ?? 0;
The query "SELECT SUM([Amount])" will return NULL for empty list. But if you use LINQ it expects that the "Sum(l => l.Amount)" returns double and it doesn't allow you to use "??" operator to set 0 for empty collection.
In order to avoid this situation you need to make LINQ expect "double?". You can do it by casting "(double?)l.Amount".
It doesn't affect the query to SQL but it makes LINQ working for empty collections.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With