2009-08-14 5 views
0
var result = from R in db.Clients.Where(clientWhere)  
      join RA in db.ClientAgencies on R.SysID equals RA.SysID 
      join A in db.Agencies.Where(agencyWhere) on RA.AgencyID equals A.AgencyID 
      join AC in db.AdCommittees on A.AgencyID equals AC.AgencyID into temp 
      from x in temp.DefaultIfEmpty().Distinct() 
      select new {R,RA,x}; 

ユーザーがCommitteeIDに入ると、これは私が行うことですが、より良い方法が必要だと感じています。linqにこの節を追加するには、より良い方法が必要です。

var query = (from R in result 
       where R.x.CommitteeID == params.CommitteeID 
       select R.R).Distinct(); 
    return query; 

もっと良い方法がありますか?

答えて

0

どのようにデータを使用していますか?ジョインは、達成しようとしていることに応じてあなたを傷つける可能性があります(データ構造のコンテキストなしで見ることは非常に困難です)。

私はあなたが必要とするかもしれないし、必要でないかもしれないデータのログを持っているように見えるということ以外は、linqに違反することはできません。

私が持っているもう1つの問題は、DefaultIfEmpty()を呼び出すときにクエリを実行することです。これは、結果を計算するためにデータベースを再度ヒットする可能性のあるフィルタを実行することを意味します。

DBスキーマに関する情報とクエリから得ようとしていることを教えてください。

+0

DefaultIfEmpty()は、あまりにも、繰延操作です。 Reflectorで確認できます - "return source.Provider.CreateQuery ..." – dahlbyk

+0

毎日何かを学ぼう。私はそれがどのように動作するのだろうか、あなたが安全にデフォルトをnullにする場合は、クエリを構築できますか? – Spence

+0

LINQはあまり気にしません。DefaultIfEmptyメソッドの呼び出しをクエリプロバイダに渡し、それに応じて処理します。通常のSQL変換では、これは左外部結合になります。 – dahlbyk

0

あなたが何かのためにあなたの中間のクエリを使用していない場合、私は(最初committeeIDによってフィルタを)それを反転します:

Client GetCommitteeClient(int committeeID) 
{ 
    return (
     from AC in db.AdCommittees 
     where AC.CommitteeID == committeeID 
     join A in db.Agencies.Where(agencyWhere) on AC.AgencyID equals A.AgencyID 
     join RA in db.ClientAgencies on A.AgencyID equals RA.AgencyID 
     join R in db.Clients.Where(clientWhere) on RA.SysID equals R.SysID 
     select R 
     ).SingleOrDefault(); 
} 
関連する問題