2011-01-22 32 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); 

在上面的代碼,我會得到一個錯誤,因爲我不能創建DataServiceCollection,因爲我選擇了TBLTable1的一些字段,以及一些相關實體的一些字段。有沒有辦法解決?當我使用WCF數據服務時,是否必須始終選擇一個實體的所有字段,並且沒有相關的字段?我能至少對結果做一個foreach嗎?
Tks

回答

0

限制是查詢必須返回「實體」。最簡單的方法就是返回表示你試圖獲得的實體的類的實例。然後你可以對它進行子集化,只包含你想要的屬性。你也不能「扁平化」結果,所以如果你只想要一個相關實體的屬性的子集,你需要投影該實體,但只需要一些屬性。例如(我添加了一個參考演示OData.org服務):

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); 
} 

這將運行這個網址:

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