2010-03-31 8 views
3

Если задана сущность с DateTime как строка, каковы мои параметры для фильтрации данных с LINQ to Entities в дату?Linq to Entities DateTime Conversion

Это, кажется, не поддерживает меня, делая преобразования DateTime.

В принципе, я хочу сделать:

var filtered = from item in entities.itemsSet 
       where Convert.ToDateTime(shift.starttime) >= startDate 
        && Convert.ToDateTime(shift.endtime) < endDate 
       select item; 

Какие варианты для этого?

+0

какая ошибка вы получаете, если таковая имеется? – BlackICE

+0

В основном по линиям «Linq для сущностей не поддерживается (Convert.ToDateTime (String)) ...» –

ответ

3

Вы собираетесь закончить работу с фильтрацией памяти.

//So first select your data 

var data= (from item in entities.itemsSet).ToList(); 


//Then filter 
var filtered = from item in data 
      where Convert.ToDateTime(shift.starttime) >= startDate 
       && Convert.ToDateTime(shift.endtime) < endDate 
      select item; 

Другой вариант - создать хранимую процедуру, чтобы сделать это за вас. В SP вам нужно будет начинать/заканчивать, а затем сравнивать его со строками даты, выбранными как Date Times.

+1

Мне это нравится. Хотя могут возникнуть проблемы с масштабированием, это будет работать. Путь SP - это, вероятно, путь. –

+0

Полностью согласовано, но первым сражением будет изменение типа БД на дату! – Nix

+0

И так же, как и выше, код выше может быть упрощен в один запрос .... , просто сделав var filter = (выберите элемент из entity.itemsSet.AsEnumarable() – Nix

1

У меня была такая же проблема, потому что текущий поставщик данных Sql Server для EF пренебрегает переводом DateTime.Parse в CAST (varField As DateTime).

Так строить дерево выражений, которые могут быть успешно переведены в магазин Expression, я применил следующее, который ведет себя так же, как и следовало ожидать от сказуемого: DateTime.Parse (x.DateField) == DateConstraint

Обратите внимание, что «Клиент» объект содержит входные параметры для создания предиката для использования в: EFQuery.Where (предикат)

if (client.DateOfBirth.HasValue) // can't find a string <-> DateTime conversion syntax with EF support 

     { 

      var day = client.DateOfBirth.Value.Day.ToString().PadLeft(2, '0'); 

      var month = client.DateOfBirth.Value.Month.ToString().PadLeft(2, '0'); 

      var year = client.DateOfBirth.Value.Year.ToString(); 

      // very verbose, but apparently there's no EF support for String to DateTime conversion 

      spec = spec.And(c => SqlFunctions.IsDate(c.DateOfBirth).HasValue && SqlFunctions.IsDate(c.DateOfBirth).Value == 1 

       && c.DateOfBirth.StartsWith(day) 

       && month == (c.DateOfBirth.Contains("-") || c.DateOfBirth.Contains("/") 

       ? c.DateOfBirth.Substring(c.DateOfBirth.Contains("-") ? c.DateOfBirth.IndexOf("-") + 1 : c.DateOfBirth.Contains("/") 

       ? c.DateOfBirth.IndexOf("/") + 1 : 0, 2) : "f") 

       && c.DateOfBirth.EndsWith(year)); 

     } 

Как вы можете видеть, выше выполняет строка соответствует на день, месяц, и Year, а также ожидает представления DD/MM/YYYY (Aussie Aussie Aussie!). Его можно легко модифицировать для работы с различными представлениями даты и/или включать ограничения для компонента Time.

6

Используйте System.Data.Objects.SqlClient.SqlFunctions

Там это функция называется DateDiff, который имеет перегруженные принимать строки в качестве даты.

Все функции внутри класса SqlFunctions компилируются в операторы SQL и могут использоваться только внутри Linq для сущностей.

[EdmFunctionAttribute("SqlServer", "DATEDIFF")] 
public static Nullable<int> DateDiff(string datePartArg, string startDate, string endDate) 

http://msdn.microsoft.com/en-us/library/dd466158.aspx

Вам нужно будет передать строку как «день» в качестве первого параметра с указанием части даты для сравнения. Функция непосредственно сопоставляется функции SQL DATEFIFF:

http://msdn.microsoft.com/en-us/library/ms189794.aspx

Существует аналогичный класс для Linq к SQL, сразу предупреждаю.

+0

Neato! Это спасло мой бекон при использовании linq-to-entity для запроса сравнения даты в датах, хранящихся в столбце varchar. – anewcomer