ASP.NET MVC Webサイトでは、ユーザーがブックを参照します。彼らは自分自身で作成したリストに各書籍を追加することができます。外部DbContext呼び出し中のEF DbContextの内部呼び出し非同期動作ASP.NET MVC
ユーザーが書籍を閲覧すると、各書籍の下にすべてのリストがドロップダウン表示され、書籍を追加することができます。これまでのところ良いことだが、私が今したいのは、書籍が既にユーザーのリストの1つに含まれているかどうかを知ることです。
これは、関連のviewmodelです:
public class UserBookListsMinimalVM {
public int ListId { get; set; }
public string ListName { get; set; }
public bool BookAlreadyInList { get; set; }
}
そして、これは私がアイテムを取得するために実行クエリです:
var userBookLists = await context.vwUserBookLists
.Where(x => x.ListOwner == userName)
.Select(x => new UserBookListsMinimalVM
{
ListId = x.ListId,
ListName = x.ListName,
BookAlreadyInList = context.List_Books.Any(y => y.ListId == x.ListId && y.BookId == bookId)
})
.OrderBy(x => x.ListName)
.ToListAsync();
vwUserBookLists
は、リスト関連の情報やList_Book
を含むビューが仲介ですリストと本の間の表(リストごとの本など)。
EFで生成されたSQLは、ステートメントのネストされており、主にBookAlreadyInList
プロパティを考慮しています。 (私は、クエリを簡素化することができるかどうかわからない、私は提案を開いてる)
は、それがawait
編ではありません見て、BookAlreadyInList
割り当て中context
への呼び出しは関数全体の非同期を「壊す」していますか?
このコードで予期しない動作が発生しましたか?何か動作していないのですか?具体的に何を求めているのかは分かりません。 '.Any()'の呼び出しは非同期ではないので、待つ必要はありません。 – David
こんにちは@David - 正常に動作します(つまり、意図したとおりに結果を返します)。私の質問は、 'BookAlreadyInList'の割り当て中の' context'への非同期呼び出しが、 'await context'外部非同期呼び出しと競合するかどうかです。 '.Any()'は '.AnyAsync()'になるべきですか? – globetrotter
私は '.AnyAsync()'はありませんと思いますが(すぐにテストすることはできますが)。 '.Any()'はデータソースから何も実際には実現しないので、本当に必要はありません。他のLINQメソッドと同様に、バッキングデータストアの式ツリーに変換されます。データ( '.ToList()'のような)を実際に実現するメソッドだけが非同期バージョンを必要とします。 – David