1

さて、EFのパフォーマンスをもう一度テストしていて、データベースから単純な結果を返したいだけです。

var jobsList = from j in mf.Jobs
                       where j.UserID == 1001 select new { Job = j };

残念ながら、これは私のUserオブジェクトをこのリストに結合しますが、EFには実行させたくありません。関係があるからといって参加しないようにEFに指示するにはどうすればよいですか。基本的に、私はそのテーブルから単純な行が欲しいだけです。

または、別のタイプの検索を使用する必要がありますか?私はまだ以下の基本的なタイプのデータベース検索を使用しており、今ではdb作業を処理するためのより良い方法があると感じています。

SqlConnection myconnection = new SqlConnection();

編集

基本的に、私が言っていることは、より明確な文脈でです。それは、次のものだけを取得するのではなくです。

Job.JobID
Job.UserID
//Extra properties

ゲット

Job.JobID
Job.UserID
Job.User
//Extra properties

そのUserオブジェクトは、必要以上のメモリを簡単に消費します。さらに、私はそれを必要としません。

私の解決策

だから私はまだEFをあまり信じていません。その理由はここにあります。LazyLoadingをオフにしてオンにしたところ、パフォーマンスの違いはあまり気になりませんでした。次に、SqlConnectionタイプのメソッドが使用するデータの量をEFメソッドと比較しました。

まったく同じ結果セットが返されます。パフォーマンスの違いは次のとおりです。

私のEntityFrameworkメソッドでは、ジョブのリストが返されます。

MyDataEntities mf = new MyDataEntities(); // 4MB for the connection...really?
mf.ContextOptions.LazyLoadingEnabled = false;
// 9MB for the list below
var test = from j in mf.Jobs
           where j.UserID == 1031
           select j;
foreach (Job job in test) {
     Console.WriteLine(job.JobID);
}

ストアドプロシージャを実行して結果セットを返すSqlConnectionメソッドの場合。

//356 KB for the connection and the EXACT same list.
List<MyCustomDataSource.Jobs> myJobs = MyCustomDataSource.Jobs.GetJobs(1031); 

Entity Frameworkが標準のSqlConnectionよりもはるかに多くのことを行っていることを完全に理解していますが、結果セットに少なくとも25倍のメモリが必要な場合は、なぜこのような誇大宣伝が行われるのでしょうか。それだけの価値はないようです。

私の解決策は、結局EFを使用しないことです。

4

5 に答える 5

1

プロパティはジョブクラスのUser一部ですが、アクセスするまで読み込まれません(遅延読み込み)。したがって、実際には「結合」されていません。

指定された2つの列のみが必要な場合は、次のように記述できます。

var jobsList = from j in mf.Jobs
               where j.UserID == 1001 
               select new { 
                          Job.JobID, 
                          Job.UserID 
                          };
于 2012-05-08T22:09:38.583 に答える
1

この動作の最も可能性の高い理由は、LazyLoadingEnabledプロパティがtrueに設定されていることです。

この場合、ユーザーは元のクエリで復元されません。ただし、このプロパティにアクセスしようとすると、デバッグ中に検査を行っても、データベースからロードされます。ただし、アクセスしようとした場合に限ります。

このSQLServerProfilerを開いて、どのコマンドがDBに送信され始めているかを確認できます。

コードは、積極的な読み込みや明示的な読み込みを使用していません。だからこれが理由に違いない。

于 2012-05-08T22:11:50.733 に答える
0

JobのUserプロパティにアクセスするまで、ユーザーは実際にはコンテキストに接続されません。ユーザーのnullを取得する場合は、遅延読み込みをオフにします。

于 2012-05-08T22:17:27.390 に答える
0

EFはあなたが1つの結果だけを望んでいることを知らないと思います。このようなことを試してください。

Job jobsItem = mf.Jobs.Single(j=>j.UserID==1001)

ランバを使いたくないなら...

Job JobItem = (from j in mf.Jobs where j.UserID == 1001 select j).Single()

私は今のところコンパイラを持っていません。構文が正しいことを願っています。優先する場合は、変数varの代わりにを使用できます。効果はありませんが、この方が読みやすいJobと思います。Job

于 2012-05-08T21:57:02.110 に答える
0

Entity Frameworkは、プロパティの遅延読み込みをサポートしていません。ただし、テーブル分割があります

プロパティを強調しました。もちろん、EntityFrameworkは行の遅延読み込みをサポートしています

于 2012-05-08T22:34:10.347 に答える