Linq для преобразования даты и времени в объекты - PullRequest
3 голосов
/ 31 марта 2010

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

Кажется, он не поддерживает преобразование DateTime.

В основном, я хочу достичь:

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

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

Ответы [ 3 ]

6 голосов
/ 20 марта 2012

Использовать 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 to SQL, просто предупреждающий вас.

3 голосов
/ 31 марта 2010

В конечном итоге вы будете выполнять фильтрацию памяти.

//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 голос
/ 16 февраля 2011

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

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

ПРИМЕЧАНИЕ. Объект «Client» содержит входные параметры для созданияПредикат для использования в: 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));

         }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...