2011-01-27 19 views
2

効率的なLinqクエリにこのクエリループを作成する助けてもらえますか?私はTreeViewにこれをロードして、各項目を添付する必要があります。インクルードも非常に非効率的です。怠惰なアイテムの読み込みでも機能しません。それがあるように、このクエリは、より多くの回数、これは働いていた最終的なコードだった気にするものについてはより効率的なLINQクエリ

public IQueryable<Client> GetTopLevelData(Guid agentGuid, int year) 
    { 
     var clients = from client in ObjectContext.Clients 
         join cbc in ObjectContext.Client_Bucket_Client on client.Client_GUID equals cbc.Client_GUID 
         join acb in ObjectContext.Agent_Client_Bucket on cbc.Client_Bucket_GUID equals acb.Client_Bucket_GUID 
         where acb.Agent_GUID == agentGuid 
         select client; 

     foreach (Client c in clients) 
     { 
      var transactions = ObjectContext.Transactions.Where(t => t.Client_GUID == c.Client_GUID && t.Year == year); 
      foreach (Transaction t in transactions) 
      { 
       t.Forms.Attach(ObjectContext.Forms.Where(f => f.Transaction_GUID == t.Transaction_GUID && f.Year == year)); //.OrderByDescending(fo => fo.Create_Date)); 
      } 
      c.Transactions.Attach(transactions); 
     } 

     return clients; 
    } 
+0

エンティティへのLINQ to SQLまたはLINQ? – Adrian

+0

LINQ to Entities。 –

答えて

1
public IQueryable<Client> GetTopLevelData(Guid agentGuid, int year) 
{ 
    var clients = 
     from client in ObjectContext.Clients 
     join cbc in ObjectContext.Client_Bucket_Client on client.Client_GUID equals cbc.Client_GUID 
     join acb in ObjectContext.Agent_Client_Bucket on cbc.Client_Bucket_GUID equals acb.Client_Bucket_GUID 
     where acb.Agent_GUID == agentGuid 
     select client; 

    var clientInfos = 
     from c in clients 
     select new 
     { 
      Client = c, 
      TransactionInfos = ObjectContext.Transactions 
       .Where(t => t.Client_GUID == c.Client_GUID && t.Year == year) 
       .Select(t => new 
       { 
        Transaction = t, 
        ToAttach = ObjectContext.Forms.Where(f => f.Transaction_GUID == t.Transaction_GUID && f.Year == year) //.OrderByDescending(fo => fo.Create_Date) 
       }) 
     }; 

    // Looping over this query will hit the database *once* 
    foreach (var info in clientInfos) 
    { 
     foreach (var transactionInfo in info.TransactionInfos) 
      transactionInfo.Transaction.Forms.Attach(transactionInfo.ToAttach); 

     info.Client.Transactions.Attach(info.TransactionInfos.Select(t => t.Transaction)); 
    } 

    // Return a queryable object; constructing a new query from this will hit the database one more time 
    return clients; 
} 
+0

これをコンパイルするには、構文を少し変更しなければなりませんでした。それほど多くはありませんが、このエラーが発生しました。クエリ '' GetTopLevelData ''の読み込み操作が失敗しました。このメソッドは、マテリアライズ照会の結果に対してはサポートされていません。 –

+0

@Inturbidus:私が書いたこの方法ではなく、あなたが書き込んだ他のコードでこのエラーを受け取ったはずです。 – Timwi

+0

これはforeach(Info.TransactionInfosのvar transactionInfo)でエラーが発生しました.... –

2

を必要以上にデータベースを打ちます。

var clients = 
    from client in ObjectContext.Clients 
    join cbc in ObjectContext.Client_Bucket_Client on client.Client_GUID equals cbc.Client_GUID 
    join acb in ObjectContext.Agent_Client_Bucket on cbc.Client_Bucket_GUID equals acb.Client_Bucket_GUID 
    where acb.Agent_GUID == agentGuid 
    select client; 

     var clientInfos = 
      from c in clients 
      select new 
      { 
       Client = c, 
       TransactionInfos = ObjectContext.Transactions 
        .Where(t => t.Client_GUID == c.Client_GUID && t.Year == year) 
        .Select(t => new 
        { 
         Transaction = t, 
         ToAttach = ObjectContext.Forms.Where(f => f.Transaction_GUID == t.Transaction_GUID && f.Year == year) //.OrderByDescending(fo => fo.Create_Date); 
        }) 
      }; 

     // Looping over this query will hit the database *once* 
     foreach (var info in clientInfos) 
     { 
      foreach (var transactionInfo in info.TransactionInfos) 
      { 
       transactionInfo.Transaction.Forms.Attach(transactionInfo.ToAttach); 
      } 

      var tt = info.TransactionInfos.ToList(); //.Select(t => t.Transaction); 

      var trans = tt.Select(t => t.Transaction); 

      info.Client.Transactions.Attach(trans); 
     } 

     // Return a queryable object; constructing a new query from this will hit the database one more time 
     return clients; 

私はフォームをつかむためにLINQのコンパイラを取得するには下部のリストを列挙しなければなりませんでした。