Сравнение даты EF CORE LINQ с новым DateTime (yearId, monthId, dateId) - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь выполнить запрос LINQ для DbSet в контексте EF. Класс LastDAyToEnterData в классе DbSet имеет 3 свойства get / set короткого типа и сопоставлен с таблицей SQL Server с 3 столбцами типа smallint для года, месяца и дня соответственно. Когда я использую выражение в .Where(), я получаю эту ошибку. Какое выражение я должен использовать, чтобы сравнить две даты? Спасибо.

Не удалось перевести выражение LINQ. Либо переписайте запрос в форме, которую можно перевести, либо переключитесь на оценку клиента явно, вставив вызов либо в AsEnumerable (), AsAsyncEnumerable (), ToList (), либо в ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

DbSet<LastDayToEnterData>
    .Where(l => new DateTime(
        (int)l.YearID, 
        (int)l.MonthID, 
        (int)l.StopEnteringDataAfter
    ) > new DateTime(
        DateTime.Today.Year - 1, 
        10, 
        1
    ))

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Не удалось перевести выражение LINQ. Либо переписайте запрос в форме, которую можно перевести, либо переключитесь на оценку клиента явно, вставив вызов либо в AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

Причина в том, что неявная оценка клиента была отключена в EF Core 3.

Ссылка:

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq - запросы, которые больше не оцениваются на клиенте

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

1 .Модель:

public class LastDayToEnterData
{
    public int Id { get; set; }
    public int YearID { get; set; }
    public int MonthID { get; set; }
    public int StopEnteringDataAfter { get; set; }
    public string Name { get; set; }
}

2.Контроллер:

var date = _context.LastDayToEnterData.Select(u => new { u.MonthID, u.YearID, u.StopEnteringDataAfter,u.Id }).ToList();
var list = new List<LastDayToEnterData>();
foreach(var d in date)
{
    var ConvertDate = new DateTime(d.YearID,d.MonthID, d.StopEnteringDataAfter);
    if(ConvertDate > new DateTime(DateTime.Today.Year - 1, 10, 1))
    {
        var data = _context.LastDayToEnterData
                           .Where(l => d.Id == l.Id).FirstOrDefault();
        list.Add(data);
    }               
}
0 голосов
/ 31 марта 2020

Вам необходимо использовать DbFunctions.CreateDateTime , чтобы создать новый объект DateTime, а также спроектировать сравнение даты из Linq:

var compareDate = new DateTime(DateTime.Today.Year - 1, 10, 1);

DbSet<LastDayToEnterData>
    .Where(l => EntityFunctions.CreateDateTime(
        (int)l.YearID, 
        (int)l.MonthID, 
        (int)l.StopEnteringDataAfter
    ) > compareDate )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...