2017-05-23 11 views
0

エンティティに添付されたナビゲーションプロパティをロードする必要がある次のコードを仮定します(私はEF CoreとEF 6でこの問題に直面しました。ファイン)`.Select`メソッドを使用して追加のループをスキップする

ViewBag.DisplayTags = new String(query.ArticlesTags.SelectMany(x => { 
          db.Attach<EFContext.Database.ArticlesTags>(x).Navigation("Tag").Load(); 
          return x.Tag.Name + ", "; 
         }).ToArray()); 

私は選択文の中のEFトラッカーにコレクションを添付して、ナビゲーションプロパティをロードします。私はこれを行って、forループをもう一度スキップしました。

質問は、別のループをスキップすることは利点です(selectは内部的にループを実行するため)。このアプローチは私の見解から隠されている問題を引き起こしますか?何か欠点はありますか?それはお勧めですか?

+0

EFログを調べて、それがどのようなものになっているのかを知ることはどうですか? – Karolis

+0

@Karolis:どうしたらいいのか分かりません。そのリンクを共有していただけますか? – Arrrr

+1

これはロギングに役立つと思います。https://msdn.microsoft.com/en-us/library/dn469464(v=vs.113).aspx – Karolis

答えて

0

これを行わないでください。データベースのすべてのArticlesTagに対して1つのクエリを実行します。したがって、ArticlesTagsテーブルに100行がある場合、上記のコードは、データベースサーバーに対して101のクエリを順次実行します(ArticlesTagsの直接クエリの場合は1つ追加します)。

次のコードは、ArticlesTagsのリストに項目ごとに実行します:明示的にデータベースを照会することによって、その単一ArticlesTag上のTagプロパティをロード

Navigation("Tag").Load(); 

を。

単一のSelect文を使用して、データベースからすべての名前をリストとして取得し、メモリ内のstring.Joinを使用してそれらを結合することができます。何かが好きです

var names = db.ArticlesTags.Select(x => x.Tag.Name).ToArray(); 
var displayName = string.Join(", ", names); 
+0

'ArticleTags'はすでに使用されています(以前のクエリによって)メモリにロードされます。だから私は 'Linq 'にもタグをつけたのです。 – Arrrr

+1

修正されました。 101のクエリを発行します。あなたのSelectManyの内容は各ArticlesTagに対して実行され、データベースに別のクエリを発行します – Jeff

+0

この場合、 'SelectMany'はデータベースとは関係ありません。 – Arrrr

関連する問題