2016-12-28 4 views
1

私はMySQLデータベースからデータを取得するためにEFを使用しています。EFクエリメソッドを再利用する必要がありますか?はい、それを行う方法

ここでは、2つのテーブルがあります。最初はcustomersとproject_codesです。

テーブルproject_codesには、id_customersという名前の顧客に対するFKがあります。このようにして、どのプロジェクトが顧客に属しているかを照会することができます。私のDALに

、私は次のように得た:

public List<customer> SelectAll() 
{ 
    using (ubmmsEntities db = new ubmmsEntities()) 
    { 
     var result = db.customers 
        .Include(p => p.project_codes) 
        .OrderBy(c=>c.customer_name) 
        .ToList(); 
     return result; 

    } 
} 

私にすべての私の顧客とそれぞれのproject_codesを出力します。

最近私はプロジェクトコードを取得するだけで済むので、データベースからすべてのプロジェクトコードを取得するためにDALを作成しました。しかし、私は自分自身を考えました: "私はそれをしなければならないのですか?私のSelectAll()メソッドを使用するのが最善ではないでしょうか、Linqを使ってすべての顧客からproject_codesのリストを私に取り出せますか?

これは私の最初でしたできるだけ多くのメソッドを再利用することは保守性の観点からは良いことですよね?

2番目の質問は、すべてのproject_codesをリストに取得する方法ですか?直接行うのは簡単ですが、

SelectAll()をベースにして達成できませんでした。

私はその顧客のプロジェクトコードを出力しましたが、私はさまざまなアプローチを試みましたが(foreach、どこで他のものがランダムにありますか)、構文が失敗したり、project_code 。それで私はプロジェクトコードを取得するための具体的な方法を使っている別の理由です。

「常識」やベストプラクティスでは、上記のようにメソッドを再利用することをお勧めしませんが、SelectAll()の戻り値を使用してproject_codeのリストを作成する方法については、いつ手に入るのか分からない。

あなたの考えを教えてください。

答えて

1

ここではトレードオフがあります。メモリ内のコレクションで大きなコレクションを反復処理(および選択など)するか、小さなコレクションを反復するが、データベースに移動する必要はありません。

設定をプロファイリングする必要がありますが、どちらが速いのかを判断する必要がありますが、メモリ内の方が良い方法が考えられます。

すべてproject_codesを取得するには、あなただけの必要な必要があります:私はコレクションの階層をフラット化するSelectManyを使用

List<customer> customers; //Fill from DAL 
List<project_code> allProjects = customers.SelectMany(c => c.project_codes).ToList(); 

注意を、私はSelectAllは実際にLINQの方法だとは思いません。

+0

これは小さなコレクションで、これは高速なサーバー上にあります。もう1つは小さい(2k行)ですが、サーバーに過負荷がかかり、4〜5秒かかることがあります。データの変更についての良い点は考慮しませんでした。私はそれが問題ではないはずです計画使用してください。どのようにプロジェクトを選択するかについては、私は迷惑...私は 'List projects = UBMMSController.GetAllCustomersEagerLoad()。SelectMany(c => c.project_codes).ToList();を試したことは確かです。これはあなたと同じで、うまくいきませんでした。私はその時何かが恋しくなったようです。ありがとう。 –

+0

@EstevaoSantiago喜んで:) – BradleyDotNET

関連する問題