无法在具有拥有实体的 class 上使用 linq 进行查询
Unable to query with linq on a class with an Owned Entity
我有一个这样的实体,其中 属性 被映射为一个拥有的实体:
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");
});
}
我可以使用 EF 将 Foo 实体插入到数据库中,并为数据库取回 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().
原因是在使用 .LastOrDefault() 时需要指定 OrderBy。
这是有效的:
var p = apiDbContext.Foos.OrderBy(x => x.Id).LastOrDefault(x => x.Filter == 1122);
我有一个这样的实体,其中 属性 被映射为一个拥有的实体:
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");
});
}
我可以使用 EF 将 Foo 实体插入到数据库中,并为数据库取回 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().
原因是在使用 .LastOrDefault() 时需要指定 OrderBy。
这是有效的:
var p = apiDbContext.Foos.OrderBy(x => x.Id).LastOrDefault(x => x.Filter == 1122);