1

登録したプレゼンテーションと重複しないすべてのプレゼンテーションを返すメソッドを設定しようとしています。しかし、これを実装しようとすると、エラーが発生して修正できないように見えました。私は見渡して同様の問題を見つけることができませんでした。私は明白な何かを欠いていますかエンティティフレームワークコア:InvalidOperationException

これはエラーです:

InvalidOperationException: variable 't0' of type 'Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor+TransparentIdentifier`2[NameSpace.Models.Presentation,Microsoft.EntityFrameworkCore.Storage.ValueBuffer]' referenced from scope '', but it is not defined

は、これらは私のモデルです。

public class ApplicationUser : IdentityUser 
{ 
    public List<Presentation> MyPresentations { get; set; } 

    public List<PresentationUser> RegisteredPresentations { get; set; } 
} 

public class Presentation 
{ 
    public int PresentationId { get; set; } 

    public string HostId { get; set; } 
    public ApplicationUser Host { get; set; } 

    public List<PresentationUser> Attendees { get; set; } 

    public int TimeId { get; set; } 
    public PresentationTime Time { get; set; } 
} 

public class PresentationUser 
{ 
    public int PresentationId { get; set; } 
    public Presentation Presentation { get; set; } 

    public string ApplicationUserId { get; set; } 
    public ApplicationUser ApplicationUser { get; set; } 
} 

public class PresentationTime 
{ 
    public int PresentationTimeId { get; set; } 
    public DateTime StartTime { get; set; } 
    public DateTime EndTime { get; set; } 
} 

これは、私は誰も私はそれが大きな助けになり、これを修正するのに役立つことができれば

private async Task<IQueryable<Presentation>> GetAvailablePresentations() 
{ 
    User user = await context.Users 
     .Include(u => u.RegisteredPresentations) 
     .ThenInclude(eu => eu.Presentation.Host) 
     .FirstOrDefaultAsync(u => u.Id == userManager.GetUserId(User)); 


    var Presentations = context.Presentations 
     .Include(e => e.Host) 
     .Include(e => e.Time) 
     .Include(e => e.Attendees) 
     .ThenInclude(e => e.ApplicationUser) 
     // Filter Out Conditions 
     .Where(e => e.Attendees.All(u => u.ApplicationUserId != user.Id)) // Cannot see Presentations they are attending. 
     .Where(e => e.HostId != user.Id);         // Cannot see their own Presentation 

    var debug = user.RegisteredPresentations.Select(ex => ex.Presentation).ToList(); 

    // This section makes it so that users can't sign up for more that one Presentation per timeslot. 
    // Error Occurs Here 
    Presentations = Presentations.Where(e => debug.All(ex => 
     ex.Time.EndTime < e.Time.StartTime || e.Time.EndTime < ex.Time.StartTime)); 
    // This also does not work 
    // Presentations = Presentations.Where(e => debug.All(ex => ex.Time.StartTime != e.Time.StartTime)); 


    return Presentations; 
} 

を動作させることはできません方法です。

注:この問題を解決するために他の多くのロジックを削除しました。このため、このコードでは不要な数字が.Include()になることがあります。

答えて

1

Presentationsはリストではありませんが、これはまだIQueryableです。これはまだDBへのクエリです。 Whereを適用すると、EFにSQLにさらにWHEREを適用するよう指示します。 しかし、debugは、メモリ内のオブジェクトのリストです(.ToList())。 EFがどのようにそれらをDBに転送すると思いますか?

すべてのフィルタリングをDBに適用する場合は、debugを「simple」(ids?のリスト)に変更する必要があります.EFはこのリストをDBに戻すことができます。

また、すべての適切なプレゼンテーションをメモリに読み込んで(.ToList())、最後のフィルタリングをメモリに適用する必要があります。 debugからmin(StartTime)とmax(EndTime)を計算し、この2つの単純な値をプレゼンテーションクエリに適用します(不要なアイテムは少なくなります)。メモリに読み込み、メモリに「強い」フィルタリングを適用します。

+0

完璧な説明、ありがとうございます。 –

関連する問題