1

私は、次のSQLテーブルを持っている:再帰的なクエリにLINQ-to-SQLを最適化する方法は?

ObjectTable 
-------------------------------------------------- 
| ID  | Name   | Order | ParentID | 
| int PK | nvarchar(50) | int | int FK |  

ObjectTable.ParentIDは異なるオブジェクトレコードのIDとの関係を持つNULL可能フィールドです。 LINQツーSQLのように見えるクラスを生成します。

public class DbObject{ 

     int ID { get; set; } 

     string Name { get; set; } 

     int Order { get; set; } 

     int? ParentID { get; set; } 

     DbObject Parent { get; set; } 

     EntitySet<DbObject> ChildObjects { get; set; } 

} 

私はDbObjectインスタンスをロードすると、私は階層的なJSONオブジェクトにデータを書き込むことができるように、私は、再帰的に子オブジェクトにアクセスできるようにする必要があります。

  • DbObject.ChildObjectsで要素にアクセスするたびに別のクエリを実行しますか? DBトランザクションが最も長くかかるので、再帰的な階層をロードするのは非常に非効率的な方法です。

  • LINQ-to-SQLおよび/またはEFで再帰的クエリを実行するためのベストプラクティスは何ですか。

  • LINQ-to-SQLは Common Table Expressionsと統合されていますか? 私たちはCTEの持つストアドプロシージャを作成し、L2Sデザイナーの上に置くと、彼らは法ではなく、財産として動作し、我々が持っている以外、彼らが他の表と同じように動作している私たちのケースでCommon Table Expression (CTE) in linq-to-sql?

+0

データモデルを変更することができますか?そうでなければ、あなたが参照している他の質問に記載されているSQL文字列の実行パスを下げる必要があると思います。 –

+0

@chrissainty、私はデータモデルを変更することができます。階層的なデータモデルが適切な状況がないと言っていますか? – smartcaveman

+0

それは不適切であるとは言いません。ちょうどstd LINQクエリでは動作しません。したがって、モデルを変更して単一のLINQクエリにすることも、sproc/textクエリを実行することもできます。ちょうどあなたが好む方法に依存します。 –

答えて

3

を見つけましたこれまでのところ問題はありませんでした。

+0

これは正解です。 Linq-to-SQLとEFのどちらも、効率的な再帰的クエリをサポートしていません。そのためにCTEでネイティブSQLを使用してください。 –