«Дата» не поддерживается в LINQ to Entities.Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей. - PullRequest
47 голосов
/ 16 августа 2011

Я пытаюсь выполнить следующий код и получаю ошибку

public List<Log> GetLoggingData(DateTime LogDate, string title)
{
     var context = new LoggingEntities();
     var query = from t in context.Logs

           where t.Title == title 
           && t.Timestamp == LogDate

           select t;
     return query.ToList();
}

Я получаю сообщение об ошибке: «Указанный элемент типа« Дата »не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей». Я пробовал различные попытки приведения каждого признака к строке, сравнивая только часть даты, но, похоже, не могу получить правильную комбинацию. Любая помощь с благодарностью.

Ответы [ 8 ]

87 голосов
/ 01 августа 2012

Если вы используете EF 6.0+, вы можете использовать DbFunctions.TruncateTime(DateTime?):

var query =
    from t in context.Logs
    where t.Title == title 
    && DbFunctions.TruncateTime(t.Timestamp) == LogDate.Date
    select t;

Примечание: для более ранней версии EF, где DbFunctions недоступно, EntityFunctions.TruncateTime(DateTime?) может использоваться вместо.

24 голосов
/ 17 августа 2011

Не самое лучшее решение, но оно работает.По ряду причин мне нужно использовать .net 3.5, и изменение базы данных будет затруднено.В любом случае, вот решение, которое работает:

            var query = from t in context.Logs
                      where t.Title == title 
                      && t.Timestamp.Day == LogDate.Day
                      && t.Timestamp.Month == LogDate.Month
                      && t.Timestamp.Year == LogDate.Year
                      select t;

Не самое элегантное решение, но оно эффективно.

3 голосов
/ 26 октября 2015

EntityFunctions.TruncateTime (t.Timestamp) устарело с EF6.

Используйте ниже

DbFunctions.TruncateTime (t.Timestamp)

2 голосов
/ 13 июня 2013

Всегда используйте EntityFunctions.TruncateTime () для x.DateTimeStart и LogDate. такие как:

var query = from t in context.Logs
              where t.Title == title 
              && EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate)
              select t;
1 голос
/ 03 октября 2011

Поправьте меня, если я ошибаюсь, но в примере mikemurf22 нужно будет проверить каждую часть компонента даты и, возможно, намного больше обработки на сервере?

В любом случае, я наткнулся на эту проблему,и это мое решение.

Предполагая, что вы собираетесь передавать только компонент даты, вы можете найти последнюю минуту дня, в который вы проходите, и использовать предложение where для определения диапазона..

public List<Log> GetLoggingData(DateTime LogDate, string title)
{
    DateTime enddate = new DateTime(LogDate.Year, LogDate.Month, LogDate.Day, 23, 59, 59)

    var query = from t in context.Logs
                where t.Timestamp >= date
                where t.Timestamp <= enddate
                select t;

    return query.ToList();
}
0 голосов
/ 20 августа 2015

Попробуйте это:

var calDate = DateTime.Now.Date.AddDays(-90);

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)
0 голосов
/ 30 октября 2013

Конвертируйте LongDate в .ToShortDateString, и тогда вы можете использовать его следующим образом:

EntityFunctions.TruncateTime(t.Timestamp) == LogDate

как Майк сделал

0 голосов
/ 26 июля 2012

Вы можете использовать этот хак:

DateTime startDate = LogDate.Date;
DateTime endDate = LogDate.Date.AddDays(1);

var query = from t in context.Logs
            where t.Title == title 
                  && t.Timestamp >= startDate 
                  && t.Timestamp < endDate
            select t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...