2016-07-26 8 views
2

だが、私はそうのような方法があるとしましょう:dbSetです.dbSetが呼び出された後に呼び出されると無意味ですか?

public DbSet<Ingredient> GetIngredients(int limit = 0) 
     { 
      return db.Ingredients; 
     } 

私のコントローラでは、私はこのような呼び出し行うことができるよう:GetIngredients()呼び出しがあるので

var ingredients = GetIngredients() 
.Include(i => i.AspNetUser) 
.Include(i => i.AspNetUser1) 
.Include(i => i.Ingredient_Category) 
.Include(i => i.Measurement_Unit); 

が、それは無意味か遅くなりますとにかくすべてをロードするつもりですか?

もしそうなら、GetIngredients()をさまざまなインクルードをパラメータとして使用する方法がありますか?

最悪のシナリオ各シナリオでリポジトリに異なるメソッドをロードすることができます(または、とにかくそれを行う必要がありますか?コントローラーがビューの何を望んでいると言っているかのように感じるか...)そしてEFに私は私のリポジトリからIEnumarablesを返すべきか?)

多くのおかげ

+1

あなたの質問を明確にする必要があります。もしあなたが含まれていれば使用します。1.遅延読み込みをしません。2.遅延読み込みをしていますが、すべてを単一のクエリで要求します。今度は、多対多の関係を含む複数のインクルードを含めると、おそらく、それらを別々にロードしてカーステッシュの生産を避けたいと思うでしょう。含まれているものにフィルタリングを適用したいので、あなたはあなたに何かをしたいのですか?あなたの質問はまだ分かりません。 –

答えて

1

を、それは無意味か遅くなるGetIngredients()呼び出しは はとにかくすべてをロードするために起こっているので?

いいえ、あなたのクエリはあなたがそれを相談するまで(foreachのを経由して、例えば)が実行されようとしたりToListまたはToArray extenstion方法

を呼び出していない私は(GetIngredientsを得ることができる方法はあります)へさまざまなインクルードを paramsとして使用しますか?あなたの最後の懸念について

public IQueryable<Ingredient> GetIngredients(List<Expression<Func<TEntity, object>>> includes = null) 
{ 
    IQueryable<TEntity> query = db.Ingredients; 

    if (includes != null) 
    { 
     query = includes.Aggregate(query, (current, include) => current.Include(include)); 
    } 
    return query; 
} 

あなたDbContextが配置される前に、あなたはあなたのDBからデータをフェッチする必要があります。したがって、コントローラからこのメソッドを呼び出して結果をパラメータとして渡す場合は、戻り値の型をIEnumerable<Ingredient>に変更し、メソッドquery.ToList();の最後にToListを呼び出して、クエリを実行する前にクエリを実行していることを確認してください。結果はあなたの意見になります。

+0

"いいえ、あなたが(foreachを使って)それを調べたりToListやToArray extendstionメソッドを呼び出すまでクエリは実行されません"と私が知る必要があったものです! – rory

関連する問題