2017-07-31 19 views
4

私はトピックのオブジェクトと関連記事オブジェクトを操作したいが、方法TestAsyncをimplimentしたいこれらのドメインモデルに例えばEntity Framework - 遅延読み込みまたは追加の非同期/待機クエリメソッド?

public class Topic 
{ 
    public int TopicId { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 

    public int? TopicId { get; set; } 
    public virtual Topic Topic { get; set; } 
} 

を持っています。

トピックモデル私はasyncメソッドとtopicIdをparamとして使用できます。

public async Task<bool> TestAsync(int topicId) 
{ 
    var topic = await topicService.GetByIdAsync(topicId); 

    // posts ... 
} 

私は2つの方法、関連する投稿を取得する方法があります。 LazyLoadingまたは別の非同期クエリを使用する場合の違いは何ですか?

// Example: 1 (LazyLoading) 
var posts = topic.Posts; 

// OR Example: 2 (Async method) 
var posts = await postService.GetAllByTopicIdAsync(topicId); 

だから、私は例だと思います:1意志が同期動作し、また、私は非同期のすべての利点を失うこと/コードを待ちます。 例:2は私に、レイジーロードのすべての魅力を知っているとは思わないかもしれません:) 誰にどのようなソリューションを使用すべきか、なぜそれを明確にすることができますか?ありがとう:)

+0

ASP.NETでのデータベースアクセスのasync/awaitコードの「利点」は、率直には最小限です。 –

+0

async/awaitまたはlazy loading imhoのどちらかを選択することはできません。これは、データベースへの2つのクエリの実行(遅延読み込みを使用)またはSQLでの結合(Includeを使用したeager読み込み)のいずれかを選択するものです。 –

+0

Davidしかし、多くの記事では、この時点でスレッドがスレッドプールに戻るため、データベースで動作するメソッドでの作業にasync/awaitを使用することをお勧めします。 Peter、Eager読み込みが解決策になることができます、ありがとう! –

答えて

6

レイジーローディングが不幸である、常に同期しているように変更する必要があります。たとえば、非同期ファーストのメンタリティを持つEFコアは、(まだ)遅延ロードをサポートしていません。

その他のオプションは、Peterが示唆しているように、単一のクエリを非同期に実行する結合(熱心な読み込み)を行うことです。または明示的な2番目の非同期クエリを実行することができます。どちらを選択するかは、モデルが通常どのように使用されるかによって決まります。

個人的には、モデルを常に一緒に使用する場合は熱心な読み込みを行い、それ以外の場合は複数の非同期クエリを実行することを選択します。私は自分で遅延ロードを使用しませんが、何も動作しないようにするものはありません。

+0

広範なアドバイスありがとう。それは私を助けた。ありがとうピーターも:) –

-1

どちらもしないでください。私はあなたのGetByIdAsync()がこのように実装されていると仮定しています。

public async Task<Topic> GetByIdAsync(int id) 
{ 
     return await context.Topics.FirstAsync(t=>t.Id == id); 
} 

あなたはそれが

public async Task<Topic> GetByIdAsync(int id) 
{ 
     return await context.Topics.Include(t=>t.Posts).FirstAsync(t=>t.Id == id); 
} 
+0

あなたは内部がわからないので、これはお勧めできません。トピックには何千ものレコードが含まれており、投稿はめったに使用されない場合、このソリューションは最も効果的ではありません。 – Gusman

+0

また、GetByIdAsycにパラメータを追加して、Postをロードするように要求することもできます。 –

+0

@Gusmanだから私は「仮定」と言っています。とにかくトピックの行数はこのソリューションにどのように影響しますか?気になります。 –

関連する問題