"Дата" не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности - программирование
Подтвердить что ты не робот

"Дата" не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности

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

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. Поддерживаются только инициализаторы, сущности и свойства навигации сущности". Я пробовал различные попытки лить anythign в строку, сравнивая только дату, но, похоже, не может получить правильную комбинацию. Любая помощь приветствуется.

4b9b3361

Ответ 1

Не самое большое решение, но оно работает. По ряду причин я должен использовать .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;

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

Ответ 2

Если вы используете 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?).

Ответ 4

Всегда используйте 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;

Ответ 5

Исправьте меня, если я ошибаюсь, но в примере 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();
}

Ответ 6

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

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;

Ответ 7

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

EntityFunctions.TruncateTime(t.Timestamp) == LogDate

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

Ответ 8

Попробуйте следующее:

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

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)