1

そのようにデータベースコンテキストにアクセスしようとすると、結果を通じて他のテーブルにアクセスできます。

MyEntities myEnt = new MyEntities();
    var comments = myEnt.Comments.Where(x=>x.UserName == UserName);
    foreach(Comment comment in comments){
        string FirstName = comment.UserProfile.FirstName;
    }

私のインテリセンスは外部キーマッピングをプルアップし、結合されたテーブルにアクセスできるようにしますUserProfile。これは、次のような結合を使用して標準のlinqクエリを実行するのとは対照的に、この方法で結果を「チェーン」するのは悪い習慣ですか。

var query = from comments in myEnt.Comments
join up in myEnt.UserProfiles on comments.UserId equals up.UserId
select new {...}

アップデート

また、次のようにさらに進んだ場合はどうなりますか。

comment.aspnet_Users.UserProfiles.UserRatings.ToList()

同様のことを試しましたが、2回目にこのアプローチを試した場合、クエリにかなり時間がかかったようです。インテリセンスを使用すると、関連するテーブルにかなりの距離をたどることができますが、このように複数のテーブルをリンクする場合、速度に影響しますか?

4

2 に答える 2

4

MiniProfilerを調べることをお勧めします

あなたの質問に基づいて、基礎となるプロバイダーがループ中にN + 1の問題を引き起こしている可能性があります。これは、ORMの世界では悪い習慣と見なされています。

foreach(Comment comment in comments){ string FirstName = comment.UserProfile.FirstName; }

whereステートメントを実行するときにincludesを使用して、各結果のUserProfilesを熱心にロードすることもできます。

var comments = myEnt.Comments.Where(x=>x.UserName == UserName);このような:

var comments = myEnt.Comments.Include('UserProfile').Where(x=>x.UserName == UserName);

于 2013-01-02T19:41:28.903 に答える
0

展開されたプロパティにアクセスしているコードが現在作成されているコンテキスト内にある限り、違いはないと思います。エンティティがコンテキストとコードを離れて、これらのプロパティの1つにアクセスするときです。その場合、コンテキストが閉じられると、最終的にエラーがスローされます。データモデルが変更された場合、どちらの例もコンパイル時にエラーをスローするため、これは無駄だと思います。

于 2013-01-02T19:10:28.937 に答える