3

SQLから4,000行を取得し、それらをオブジェクトのリストに配置するのに1分以上かかるいくつかのlinq操作を実行するメソッドがあります。私がやろうとしていることは、次のように要約できます。

  1. テーブルからすべての行を取得します
  2. 行フィールドに基づいて、各行を対応するオブジェクトにキャストします
  3. そのオブジェクトのリストを返します

つまり、データベースの行に対応するオブジェクトがあり、linqがそれらの行が含まれるテーブル内のすべてのオブジェクトのリストを返すようにします。

私がしていることはこれです:

public List<Article> GetAllArticlesFromDB()
    {
        using (DBEntities le = new DBEntities(this._efConnectionString))
        {
            IQueryable<ARTICLE> x = from row in le.ARTICLE select row;

            List<Article> llr = x.Select(r => new Article
            {
                 ArticleNumber = r.ARTICLE_NUMBER,
                 ArticleTitle = r.TITLE,
            }).ToList();

            return llr;
        }
    }

問題は、このクエリに1分以上かかることです。フィールドは2つだけで、1つはintで、もう1つは最大長255の文字列です。このフィールドに対する単純なSQLクエリは、1秒未満で機能します。ただし、このlinqクエリには1分以上かかります。どういうわけかこれを最適化できますか?

4

2 に答える 2

3

エンティティにどのEntityFrameworkContextアプローチを使用していますか?「古い」エンティティフレームワークアプローチは、すべてEntityObject派生オブジェクトであり、多くのオーバーヘッドをもたらすコンテキストオブジェクトを生成し、それらの4000を構築するのにかなり時間がかかる場合があります。より良いアプローチはPOCOオブジェクトを使用することです。それらは非常に小さく高速ですが、Visual Studio2010やEF4を使用している場合は別のジェネレーターを使用する必要がある場合があります(POCOの生成を可能にするVS 2012およびEF5とは対照的)箱から出してすぐに使えるエンティティ)。

どのEFバージョンとどのアプローチを使用していますか?

これは、新しいDbContextアプローチ(データベースファーストシナリオの場合)を機能させる方法を示す優れたチュートリアルです。

于 2012-11-21T22:47:31.007 に答える
0

アプリケーションにすべてを実行させるのではなく、データベースを機能させます。一度に4000レコードを実際に表示する人はいないため、ページングなどを使用して少数のレコードをプルします。フィルタリングが必要な場合は、データベースに再度フィルタリングさせます。

Articleコンストラクターはありますか?プロパティを直接割り当てるため、可能であればデフォルトのコンストラクターを使用する必要があります。

また、2つではなく1つのステートメントで実行してみましたか?それがより良いパフォーマンスになるかどうかはわかりませんが、それはアイデアです。

すなわち

List<Article> llr = (from row in le.ARTICLE
                     select new Article
                     {
                         ArticleNumber = row.ARTICLE_NUMBER,
                         ArticleTitle = row.TITLE
                     }).ToList();
于 2012-11-21T22:31:56.023 に答える