Невозможно выполнить запрос с помощью linq для класса с владельцем - PullRequest
0 голосов
/ 20 января 2020

У меня есть такая сущность со свойством, которое отображается как принадлежащая сущность:

public class Foo
{
    public int Id { get; set; }

    public DateTimeWithTimeZone DoneAt { get; set; }
} 

public class DateTimeWithTimeZone
{
    public DateTimeOffset Time { get; set; }

    public string TimeZone { get; set; }
}

И конфигурация базы данных выглядит следующим образом:

public void Configure(EntityTypeBuilder<Foo> builder)
{
    builder.HasKey(x => x.Id);

    builder.OwnsOne(x => x.DoneAt, y =>
    {
        y.WithOwner();
        y.Property(z => z.Time).HasColumnName("DoneAt");
        y.Property(z => z.TimeZone).HasColumnName("DoneAtTimeZone");
    });
}

Я могу вставить сущность Foo в базу данных с EF и возвращает список Foos для базы данных:

var list = apiDbContext.Foos.ToList();
var list = apiDbContext.Foos.FirstOrDefault(x => x.Id == 1122);

Но когда я запрашиваю LastOrDefault:

var p = apiDbContext.Foos.LastOrDefault(x => x.Id == 1122);

я получаю эта ошибка:

System.InvalidOperationException: 'The LINQ expression 'DbSet<Prescription>
    .Where(p => p.Id == 1122)
    .Select(p => (IncludeExpression(
        EF.Property<DateTimeWithTimeZone>(p, "DoneAt"), DoneAt)
    ))
    .Last()' 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 either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().

1 Ответ

2 голосов
/ 20 января 2020

Причина была в том, что при использовании .LastOrDefault () нужно указывать OrderBy.

Это работает:

var p = apiDbContext.Foos.OrderBy(x => x.Id).LastOrDefault(x => x.Filter == 1122);
...