Я пытаюсь использовать DayOfWeek
в запросе LINQ, но это не работает.
Я использую фреймворк .Net Core 6.
Я пытался:
var test = await _context.DailyConsumption.Where(t => t.Time.DayOfWeek == DayOfWeek.Sunday).ToListAsync();
--
var test = await _context.DailyConsumption.Where(t => EntityFunctions.TruncateTime(t.Time).Value.DayOfWeek == DayOfWeek.Sunday).ToListAsync();
и
DateTime firstDate = new DateTime(1753, 1, 7);
var test = _context.DailyConsumption.Where(t => EntityFunctions.DiffDays(firstDate, t.Time) % 7 == 1).ToListAsync();
3 строки кода выше дают мне тот же результат:
InvalidOperationException: The LINQ expression 'DbSet<DailyConsumption>().Where(d => (int)d.Time.DayOfWeek == 0)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'
Моя программа даже не может перевести код в SLQ-запрос, не понимаю почему.
Согласно некоторым источникам в Интернете, DayOfWeek нужно использовать по-другому в .NET Core framework. Я застрял, людей с этой проблемой не много...
РЕДАКТИРОВАТЬ : Если это может помочь, вот моя модель:
[Keyless]
public partial class DailyConsumption
{
public string Prm { get; set; } = null!;
public DateTime Time { get; set; }
public float Power { get; set; }
public float PowerConsumption { get; set; }
}
Да, это dateTime, я просто добавил модель, которую использую, к своему вопросу.
см. stackoverflow.com/questions/68737681/…, похоже, проблема в том, что вы не можете использовать Where
в его обычной форме с Entity Framework.
Помогает ли этот ответ? stackoverflow.com/questions/40271588/entity-framework-dayofweek
@ScottHannen Нет, этот ответ мне не поможет, потому что человек не использует ядро сети.
@frankM_DN Этот ответ мне больше не помогает, я пытался сгенерировать свое предложение where, как они это делают, но он не работает
Причина в том, что в EF Core 3 отключена неявная оценка клиента.
Вы можете явно переключиться на оценку клиента, вставив вызов AsEnumerable
, как показано ниже:
var test = _context.DailyConsumption.AsEnumerable()
.Where(t => t.Time.DayOfWeek == DayOfWeek.Sunday).ToList();
Просто обратите внимание, что это будет выполняться в памяти, а не в БД. Таким образом, все DailyConsumption
будут загружены EF перед применением предложения Where
и материализацией перечисления с помощью ToList()
Какой тип
t.Time
? ЭтоDateTime
?