Linq to SQL сложить дату и время

284
04 мая 2018, 10:49
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." Или я что то не так делаю?!

Answer 1

Если я вас правильно понял (а я мог неверно понять, т.к. предоставлено недостаточно информации), то:

Подробнее об ошибке здесь. Очевидно, вы пытаетесь преобразовать 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 в вашем коде.

Answer 2

Отсюда:

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
...
READ ALSO
Сохранение звуков

Сохранение звуков

У меня есть приложение, Sound Board на андроид , сделанное на Unity (те

278
Двойной поиск объектов

Двойной поиск объектов

У меня есть объекты с конкретный тегом (к примеру препятствия), и в какой-то момент мне нужно их удалить, но удалять мне нужно конкретные объекты,...

301
Сортировка коллекции GameObject

Сортировка коллекции GameObject

Есть код, который ищет некоторые объекты по тегу

248
Сравнивание DateTime

Сравнивание DateTime

В базе данных есть строка сообщения с Id=50 и определенным временем(это достоверная истина)Есть Date-дата, ее шлет мне клиент, которую я же ему...

261