2010-12-14 9 views
1

を最適化する必要があります。LINQのステートメントは、私は次のコードを書かれている

//get the user from the DB 
var tmpuser = _db.aspnet_Users.First(q => q.UserName == user.Identity.Name); 

//list the direct connections to Verbond 
List<Verbond> verb1 = tmpuser.UsersVerbondens 
          .Where(q => q.Schooljaar.Sch_Schooljaar == schooljaarparam) 
          .Select(q => q.Verbond) 
          .ToList(); 

//list the connected Facturatieverbonden 
List<FacturatieVerbonden> verb2 = tmpuser.UsersFacturatieVerbondens 
             .Where(q => q.Schooljaar.Sch_Schooljaar == schooljaarparam) 
             .Select(q => q.FacturatieVerbonden) 
             .ToList(); 

//loop through the facturatieverbonden and add their verbonds to the first list 
foreach (FacturatieVerbonden v in verb2) { 
    verb1.AddRange(v.Verbonds); 
} 

//make a distinct list 
List<Verbond> test = verb1.Distinct().ToList(); 

だから、ユーザーは0以上のfacturatieverbondenに接続することができ、またverbondに接続することができます。

facturatieverbondenは、それ自身の下に1つ以上のverbondを持つことができます。

私が必要とするのは、ユーザーがfacturatieverbondenを介して直接的または間接的に接続されているverbondのすべてのリストです。

私のコードは動作しますが、それは非常に効率的ではないと思います。それをきれいにするためのヒント?

答えて

5

あなたのお問い合わせはあまりLINQyではありません。ここで、改善の可能性があります:

  //list the direct connections to Verbond 
var test = (from q in tmpuser.UsersVerbondens 
      where q.Schooljaar.Sch_Schooljaar == schooljaarparam 
      select q.Verbond) 
      //return distinct values 
      .Union 
      //list the connected Facturatieverbonden 
      (from q in tmpuser.UsersFacturatieVerbondens 
      where q.Schooljaar.Sch_Schooljaar == schooljaarparam 
      from v in q.FacturatieVerbonden.Verbonds 
      select v) 
      //return a List 
      .ToList(); 

ToListそれがない非常に最後にすることで、全体の計算は、すべての中間のリストを避け、データベース内で行うことができます。

+0

良いアイデアだが小さな問題:q.Verbondとvf.Verbonds(複数)は異なるタイプです。 –

+0

David B:それは外国語でプログラミングするときの問題です。何かが意味をなさないときは分かりません。今は持っていますか? – Gabe

+0

は素晴らしい作品です! :) – Stefanvds

0

あなたのパフォーマンスの問題はこちらです。各AddRangeコールはv.Verbondsを列挙し、それぞれはデータベースラウンドトリップになります。パフォーマンスを強化する余地はまだあります

//query the connected Facturatieverbonden 
IQueryable<FacturatieVerbonden> verbQuery2 = tmpuser.UsersFacturatieVerbondens 
    .Where(q => q.Schooljaar.Sch_Schooljaar == schooljaarparam) 
    .Select(q => q.FacturatieVerbonden); 

verb1.AddRange(verbQuery2.SelectMany(fv => fv.Verbonds)); 

が、少なくともこのアドレス総問題:

//loop through the facturatieverbonden and add their verbonds to the first list 
foreach (FacturatieVerbonden v in verb2) { 
    verb1.AddRange(v.Verbonds); 
} 

それを修正するには。あなたは簡単に10倍のスピードアップを観察することができます。

関連する問題