2012-04-21 3 views
1

WCF Data Services 4.0を使用すると、階層データが返されません。私はEquipmentIdsのコレクションを持つEmployeeクラスを持っています。それらのEquipmentIdsはワイヤー上で失われています。ここに私のコードだ:odata v2で階層データを送信するにはどうすればよいですか?

public class ODataV2 : DataService<ODataV2Model> 
{ 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
     config.UseVerboseErrors = true; 
     config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); 
     config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
    } 
} 
public class ODataV2Model 
{ 
    public ODataV2Model() 
    { 
     Employees = new List<Employee>{ 
      new Employee { Id = 1, Name="Doug", EquipmentIds = new List<Equipment> { new Equipment { Id = 1 },new Equipment { Id = 2 } }.AsQueryable()}, 
      new Employee { Id = 2, Name= "George", EquipmentIds = new List<Equipment> {new Equipment { Id = 3}, new Equipment { Id = 5} }.AsQueryable() } 
     }.AsQueryable(); 
    } 
    public IQueryable<Employee> Employees { get; private set; } 
    public IQueryable<Equipment> EquipmentIds { get; private set; } 
} 
[DataServiceKey("Id")] 
public class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public IQueryable<Equipment> EquipmentIds { get; set; } 
} 
[DataServiceKey("Id")] 
public class Equipment 
{ 
    public int Id { get; set; } 
} 

私はそれでLinqPadを実行すると、私はこれを取得: Employees with 0 EquipmentIds on them

私は2のカウントとEquipmentIdsの両方のコレクションを持っている必要がありますが、私は、私は受け取りません0を持っていますエラーは発生しますが、データはクライアントに送信されません。

私はWCF Data Services v 5.0に切り替えましたが、.NET側で正常に動作しましたが、LinqPadを使用してクエリを実行できなくなりました。これがv 4.0で動作する方法はありますか?

もしそうでなければ、LinqPadをodata v3(WCF Data Services 5.0)を認識できるようにアップグレードする方法はありますか?

+1

展開していますか? (何かのEmployees.Expand( "EquipmentIds")) – Pawel

答えて

1

クエリ〜/ Employeesには、ナビゲーションプロパティのコンテンツではなく、Employeeエンティティのみが含まれます。これは、ペイロードサイズを減らすためです。実際には、〜/ Employees?$ expand = EquipmentIdsなどのナビゲーションプロパティをいくつか含めるだけの場合は、

+0

@パウエル両方のおかげで、[このMSDNのリンク](http://msdn.microsoft.com/en-us/library/ee358709.aspx)が見つかりました遅延されたコンテンツの読み込みになります。コメントするだけで、私はEmployees.First()を実行すると本当に期待しています。再度、感謝します。 – DougJones

+0

その場合の問題は、LINQ自体の制限です。 First()はクエリを評価します(クエリを作成せず、強制的に実行します)。したがって、クエリでは結果にプロパティアクセスがあることはわかりません。これはプロパティの遅延ロードのサポートを必要としますが、プロパティアクセスは常に同期的なのでタイミングに問題がありますが、プロパティアソシエータ内で要求/応答を実行するとスレッドが長時間ブロックされる可能性があります。 –