1

Entity Framework で簡単なクエリを実行しようとしています。

ファンキーなもののリストがあります

List<FunkyThing> funkyThings;

その中に 1 ~ 5 個の固有FunkyThingの があります。

FunkyThing
{
   string FunkyThingUniqueCustomerCode{get;set}
   string UsefullInfoRegardFunkyThings{get;set}
}

データベースのファンキーなものテーブルに結合しようとしています。

表は次のように見えます。

FunkyThingsテーブル

int ID
string UniqueCustomerCode 
string colour
string usefulInfoOfGreatValue
decimal cost

たまたま、このテーブルには約 300,000 のファンキーなものがあります。

私が望んでいたのは、リストをテーブルに結合して、有用なInfoOfGreatValue要素を取得することです。次のように:

var listOfFunkyThingsUsefulInfoQuery = from funkyThing in funkyThings
                                   join
                                      funkyThingDBEntity in unitOfWork.FunkyThingsRepository.Get()
                                      on funkyThing.FunkyThingUniqueCustomerCode equals funkyThingDBEntity .UniqueCustomerCode

                                  select new
                                  {
                                      uniqueCode= funkyThingDBEntity .UniqueCustomerCode,
                                      usefulInfoOfGreatValue= funkyThingDBEntity .usefulInfoOfGreatValue
                                  };

残念ながら、リストに項目が 1 つしかない場合でも、クエリの実行には約 5 秒かかります。私は何を間違っていますか?

いくつかの簡単なメモ。ここで説明されているように、作業単位パターンを使用しています: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of -work-patterns-in-asp-net-mvc-application

長い技術的な理由から、顧客は整数 ID を持っておらず、文字列の顧客コードのみを持っているため、この比較が行われます。

追記事項: 作業単位の記事によると、 unitOfWork.FunkyThingsRepository.Get() は IEnumerable を返します。

 public virtual IEnumerable<TEntity> Get

私はちょうど再作業を試みたので、次のようにラムダを使用してください:

var listOfFunkyThingsUsefulInfoQuery = unitOfWork.FunkyThingsRepository.Get().Join (funkyThings, funkyThingDBEntity=>funkyThingDBEntity.UniqueCustomerCode, funkyThings=>funkyThings.FunkyThingUniqueCustomerCode ,(funkyThings,funkyThingDBEntity)=>new {uniqueCode= funkyThingDBEntity .UniqueCustomerCode, usefulInfoOfGreatValue=funkyThingDBEntity .usefulInfoOfGreatValue}) ; 

しかし悲しいことに、これには同じ時間がかかります

4

2 に答える 2

3

クエリにより、300,000 行すべてがデータベースからメモリに取得され、そこで結合が実行されます。クエリを見ると、に基づいUsefulInfoOfGreatValueてアイテムに関連付けられているものを抽出するだけです。funkyThingsUniqueCustomerCode

この記事では、Get()メソッドには既定で null に設定されるフィルター パラメーターがあります。このフィルターを設定して、クエリをより高速にすることができます (つまり、必要な行のみを取得します)。

これを試して

var funkyThingsCustomerCodes = funkyThings.Select(x => x.FunkyThingUniqueCustomerCode).ToList();

var listOfFunkyThingsUsefulInfoQuery =
      from funkyThing in unitOfWork.FunkyThingsRepository.Get(e => funkyThingsCustomerCodes.Contains(e.UniqueCustomerCode))
      select new {
        UniqueCode = funkyThing.UniqueCustomerCode,
        UsefulInfoOfGreatValue = funkyThing.UsefulInfoOfGreatValue
      };

また、テーブルの列にインデックスを作成するUniqueCustomerCodeと、上記のクエリはさらに高速になります。

于 2013-06-01T18:19:41.890 に答える
0

熱心な読み込みを使用して、include ステートメントを使用してみてください。少し速くなります。以下のリンクを参照してください。役立つ場合があります。

http://msdn.microsoft.com/en-us/data/jj574232.aspx http://blogs.msdn.com/b/adonet/archive/2008/10/07/migrating-from-linq-to-sql -to-entity-framework-eager-loading.aspx

于 2013-06-01T19:03:34.170 に答える