Это потому, что он пытается преобразовать ваш код в SQL.
string logonHours = myObj.Sum(a => TimeSpan.Parse(a.TotalLoggedInTime).TotalHours).ToString();
Конечно, все не может быть преобразовано в SQL, поэтому в этом случае он потерпит неудачу.
Вы можете используйте это:
string logonHours = myObj.ToList().Sum(a => TimeSpan.Parse(a.TotalLoggedInTime).TotalHours).ToString();
Он должен работать но «.ToList ()» заставит EF извлечь все данные из базы данных, а затем (поскольку все находится в памяти) код может применяться.
Но делайте это только при небольшом количестве данных! Лучше не запускать такие вещи в производство, если вы не знаете ожидаемую нагрузку.
Edit
Вы также можете рассмотреть возможность хранения «тиков» вместо строки (как описано здесь ). В этом случае вы сможете это сделать.
string logonHours = TimeSpan.FromTicks(myObj.Sum(a => a.TotalLoggedInTime)
На сервере SQL будет проделана дополнительная работа, и вы соберете только сумму.
Вам также следует рассмотреть возможность использования "asyn c" версия методов (ToListAsyn c, SumAsyn c, ...)