I am trying do replicate a simple COUNT / GROUP BY in LINQ. It works in SQL but my LINQ is not playing ball. I don’t want to count nulls but my LINQ statement does that for some reason.
Here is my SQL:
SELECT Count(ID),Year(DateCompleted)
FROM dbo.Requests
WHERE ISNULL(DateCompleted,'') <> ''
group by year(datecompleted)
Which returns
7 2015 102 2016
Here is my LINQ – which counts null.
var test = from r in Model.Requests
where r.DateCompleted != null
group r by r.DateCompleted.Year into grp
select new ChartSimple() { K = grp.Key.ToString(), V = grp.Count(x => x.DateCompleted != null) };
Which returns
7 2015 102 2016 10 1
What am I missing?
Advertisement
Answer
The type of DateCompleted on Request entity must be DateTime? or Nullable<DateTime> . This will tell Entity Framework that it should expect the column to be nullable and thus generate appropriate SQL. Right now, your code seems to compile, but that is because there is overload of DateTime‘s != opeartor and null being translated to DateTime type, which it cannot efficiently represent.
This will require change to the query :
var test = from r in Model.Requests
where r.DateCompleted != null
group r by r.DateCompleted.Value.Year into grp
select new ChartSimple() { K = grp.Key.ToString(), V = grp.Count() };
And the predicate in count is unecessary.