В моем приложении пользователи могут делать запросы на дополнительную информацию.Затем мне нужно иметь возможность получить эту информацию, но мне также нужно увидеть, какие заказы уже сделал пользователь, который сделал запрос.
Я настроил следующее с помощью EF Core:
Модели:
public class InfoRequest
{
public int InfoRequestId { get; set; }
public int UserId { get; set; }
public User User { get; set }
}
public class User
{
public int UserId { get; set; }
public ICollection<Booking> { get; set; }
}
public class Booking
{
public int BookingId { get; set; }
public int UserId { get; set; }
public User User { get; set }
}
Контекст:
modelBuilder.Entity<InfoRequest>(builder =>
{
builder.ToTable("inforequests");
builder.HasKey(x => x.InfoRequestId);
});
modelBuilder.Entity<User>(builder =>
{
builder.ToTable("userdetails");
builder.HasKey(x => x.UserId);
builder
.HasMany(x => x.Bookings)
.WithOne(x => x.User)
.HasForeignKey(x => x.UserId);
});
modelBuilder.Entity<Booking>(builder =>
{
builder.ToTable("bookings");
builder.HasKey(x => x.BookingId);
});
Я использую следующий код для извлечения необходимых мне данных:
public IQueryable<InfoRequest> GetAllInfoRequestsWithChildren()
=> this.Context.Set<InfoRequest>().AsNoTracking()
.Include(x => x.User)
.ThenInclude(x => x.Bookings);
Досадно, это дает мне следующую самосвязанную структуру данных, которая, очевидно, очень медленная:
InfoRequest
-> User
-> Booking
-> User
-> Booking
-> User
-> Booking
-> etc...
Как я могу предотвратить это, не втягивая все это впамять с ToList()
, а затем удаление петли вручную?Я просто хочу, чтобы EF вообще не создавал цикл.
Мне нужно следующее:
InfoRequest
-> User
-> Booking