from Manager in db.Manager
join Manager_History in db.Manager_History on new { id = (int)
((from Manager_History0 in db.Manager_History
where
Manager_History0.idmanager == Manager.id
orderby
Manager_History0.id descending
select new {
Manager_History0.id
}).Take(1).FirstOrDefault().id) } equals new { id = Manager_History.id } into Manager_History_join
from Manager_History in Manager_History_join.DefaultIfEmpty()
where
(DateTime)(SqlFunctions.StringConvert((Double)Manager_History.date_end) + " " + SqlFunctions.StringConvert((Double)Manager_History.time_end)) >= SqlFunctions.GetDate() || // Проблема вот здесь с приведением типов и тд...
(String)Manager_History.date_end == "1900-01-01"
orderby
Manager_History.sip
select new {
sip = (int?)Manager_History.sip,
Проект = Manager.Projects.Project_name,
Менеджер = (Manager.Userser.Users.firstname.TrimEnd() + " " + Manager.Userser.Users.name.TrimEnd()),
date_start = (DateTime?)Manager_History.date_start,
time_start = Manager_History.time_start,
date_end = (DateTime?)Manager_History.date_end,
time_end = Manager_History.time_end
}
Нужно сложить дату и время, и сравнить с текущей датой и временем. Не могу довести преобразование...
Ошибка CS0030 Не удается преобразовать тип "System.DateTime?" в "double" CRM_1CallCenterWPF
Manager_History.date_end.Value.Add(Manager_History.time_end.Value) >= SqlFunctions.GetDate() ||
Ошибка: System.NotSupportedException: "LINQ to Entities does not recognize the method 'System.DateTime Add(System.TimeSpan)' method, and this method cannot be translated into a store expression." Или я что то не так делаю?!
Если я вас правильно понял (а я мог неверно понять, т.к. предоставлено недостаточно информации), то:
Подробнее об ошибке здесь. Очевидно, вы пытаетесь преобразовать double в DateTime в этом участке кода:
...where
(DateTime)(SqlFunctions.StringConvert((Double)Manager_History.date_end)
Это так не сработает.
Если в вашей БД даты хранятся в формате строки, то попробуйте распарсить их с помощью:
DateTime.Parse(yourString);
А далее, можете сложить даты, любым удобным вам способом.
Надеюсь, поможет.
P.S. Кстати, У вас слишком громоздкий запрос. Советую разбить его на несколько подзапросов, что бы улучшить читабельность кода и облегчить отладку.
UPD 1. По вашему вопросу о том, как разбить код: Имелось в виду, что полезно для отладки и читабельности писать по одному селекту в переменную. Например:
var x = from item in myEnumerable
where item.Condition1
select item;
var y = from item in x
where item.Condition2 == false
select item;
var z = y.FirstOrDefault();
и т.д.
А еще задайтесь вопросом, что делают конструкции XXX.Take(1).FirstOrDefault().id в вашем коде.
Отсюда:
where DbFunctions.AddMilliseconds(Manager_History.date_end, DbFunctions.DiffMilliseconds(Manager_History.time_end, TimeSpan.Zero))
>= SqlFunctions.GetDate()
|| Manager_History.date_end == new DateTime(1900, 01, 01)
Для удобочитаемости можно ввести локальную переменную с помощью let:
let totalMilliseconds = DbFunctions.DiffMilliseconds(Manager_History.time_end, TimeSpan.Zero)
where DbFunctions.AddMilliseconds(Manager_History.date_end, totalMilliseconds)
Ещё можно вместо конструктора DateTime использовать метод Parse, если дата именно в виде строки задана. Для этого вызовем его до linq-запроса:
var dt = DateTime.Parse("1900-01-01");
...
|| Manager_History.date_end == dt
...
Сборка персонального компьютера от Artline: умный выбор для современных пользователей