2015-12-02 6 views
2

Я использую дату в которой положение в Entity Framework и получить следующее сообщение об ошибке:Лучший способ сравнить даты в Entity Framework

enter image description here

Это связано с кода ниже:

var entity = dbContext.MyTable 
         .Where(w => w.PId = 3 && w.CreatedOn.Date == mydate.Date) 
         .First(); 

Если я преобразую данные в список, используя .ToList(), то сравните его с датой, он будет работать нормально, но если я это сделаю, он сначала вытащит данные в код и отфильтрует его. Пожалуйста, помогите мне с этой проблемой. В настоящее время я использую хранимую процедуру для решения проблемы, но действительно хочу, чтобы это работало.

ответ

7

Вы можете использовать DbFunctions.TruncateTime канонической функции как этого

var entity = dbContext.MyTable 
    .Where(w => w.PId == 3 && DbFunctions.TruncateTime(w.CreatedOn) == mydate.Date) 
    .First(); 
+0

Вы должны использовать его на 'mydate' слишком или назначить' mydate.Date' другой переменной и использования, в запросе Linq. – juharr

+0

@juharr Я не был уверен в этом, спасибо –

+0

@juharr Только что проверил с EF6, не нужно использовать переменную для постоянного выражения 'myDate.Date' –

1

EF не поддерживают перевод все гранулированные операций на объектах в LINQ для запроса SQL (который является то, что происходит до этого ToList() операции) , Некоторые вещи (например, .Contains() для примитивных коллекций). Но не все.

Итак, хотя вы, возможно, ожидали, что запрос перевести на различные сравнения «DATEPART» в инструкции SQL, он просто не поддерживается. Вы должны изменить LINQ, чтобы приспособить его немного.

Один из способов - оценить круглосуточный диапазон. Это будет работать на любой стороне ToList():

DateTime minDate = new DateTime(mydate.Date.Year, mydate.Date.Month, mydate.Date.Second); 
DateTime maxDate = minDate.AddSeconds(86399); 

var entity = dbContext.MyTable 
         .Where(w => w.PId = 3 && w.CreatedOn >= minDate && w.CreatedOn <= maxDate).First(); 
0

вы не можете сравнить даты непосредственно с помощью .Date для этого вы должны использовать DbFunctions или EntityFunctions.

Я предпочитаю использовать DbFunctions

Вы можете использовать его, как указано ниже:

var entity = dbContext.MyTable 
        .Where(w => w.PId = 3 && DbFunctions.TruncateTime(w.CreatedOn) == DbFunctions.TruncateTime(mydate)) 
        .First(); 
Смежные вопросы