2011-01-22 10 views
0

WCFデータサービスにクエリを行い、その結果の情報をDataGridViewにバインドするために使用します。私が見たすべてのサンプル(like this official one)は、常に単一のエンティティのすべての列を選択する最も簡単なシナリオを想定しています。しかし、ほとんどのケースで、私は関連するエンティティからの情報が欲しいと私は照会されているエンティティのすべてのフィールドを望んでいない:私はできませんので、上記のコードでWCFデータサービスとデータバインディングで関連するテーブルを照会する

Int32 iIDFilter = 3; 
    TestEntities oTestDB = new TestEntities(new Uri("http://desk01:9877/TestEntities/")); 
    var oConsulta1 = from a in oTestDB.TBLTable1s 
        where a.IDField1 == iIDFilter 
        select new 
        { 
         IDField1 = a.IDField1, 
         IDField2 = a.TBLTable2.IDField1, 
         IDField3 = a.IDField3, 
         IDField4 = a.TBLTable3.IDField1, 
         IDField5 = a.IDRSGroup, 
         IDField6 = a.TBLTable4.IDField1 
        }; 
    DataServiceCollection<TBLTable1> eventos = new DataServiceCollection<TBLTable1>(oConsulta1); 

、私は、エラーを取得しますTBLTable1のいくつかのフィールドを選択したので、DataServiceCollectionを作成してください。また、関連するいくつかのエンティティのフィールドもいくつか選択しています。これを回避する方法はありますか? WCF Data Servicesを使用する場合、関連するフィールドのないエンティティのすべてのフィールドを常に選択する必要がありますか?結果に少なくともforeachすることはできますか?
Tks

答えて

0

クエリは「エンティティ」を返さなければならないという制限があります。取得する最も簡単な方法は、取得しようとしているエンティティを表すクラスのインスタンスを返すことです。次に、それをサブセット化して、必要なプロパティのみを含めることができます。結果を「平坦化」することもできません。そのため、関連するエンティティのプロパティのサブセットだけを必要とする場合は、そのエンティティを投影する必要がありますが、その上にはいくつかのプロパティが必要です。

http://services.odata.org/OData/OData.svc/Products()?$expand=Category&$select=ID,Name,Category/ID,Category/Name 

DemoService ctx = new DemoService(new Uri("http://services.odata.org/OData/OData.svc/")); 

var query = from p in ctx.Products 
      select new Product() 
      { 
       ID = p.ID, 
       Name = p.Name, 
       Category = new Category() 
       { 
        ID = p.Category.ID, 
        Name = p.Category.Name 
       } 
      }; 

DataServiceCollection<Product> products = new DataServiceCollection<Product>(query); 

foreach (var p in products) 
{ 
    Console.WriteLine(p.Category.Name); 
} 

これは、このURLを実行します。たとえば、(私はデモOData.orgサービスへの参照を追加しました)

関連する問題