2012-08-11 85 views
1

比方說,我有兩個表的數據庫 - GroupsItems從WCF服務檢索數據

  • Groups只有兩列:IdName
  • Items有三列:Id,GroupIdName

正如您所見,GroupsItems之間存在一對多關係。

我想使用WCF和LINQ構建一個Web服務。我已經添加了新的LINQ to SQL類文件,並且我已經導入了這兩個表。 Visual Studio已爲我自動生成適當的類。

之後,我爲服務創建了簡單的客戶端,只是爲了檢查一切是否正常。我打電話給GetAllGroups()方法後,我從Groups表中得到所有組。但他們的財產Items始終爲空。

所以我的問題是 - 是否有辦法強制WCF返回整個類(整個Group類和所有屬於它的Items)?或者這是它應該表現的方式?

編輯:這是WCF服務的內部函數,返回所有Groups

public List<Group> GetAllGroups() 
    { 
     List<Group> groups = (from r in db.Groups select r).ToList(); 

     return groups; 
    } 

我檢查,同時調試和內部GetAllGroups()功能每Group對象有它的項目,但在客戶端接收他們 - 每Items財產設置爲null

+0

@marc_s:我已經更新了這個問題。 – xx77aBs 2012-08-11 15:18:39

回答

2

很可能,您正在體驗Linq-to-SQL的默認「延遲加載」行爲。當您調試並查看.Items集合 - 導致項目被加載。但是,當您的服務代碼正常運行時不會發生這種情況。

但是,您可以強制執行「渴望加載」這些項目的 - 嘗試這樣的事:

public List<Group> GetAllGroups() 
{ 
    // this line should really be where you *instantiate* your "db" context! 
    db.DeferredLoadingEnabled = false; 

    DataLoadOptions dlo = new DataLoadOptions(); 
    dlo.LoadWith<Group>(g => g.Items); 

    db.LoadOptions = dlo; 

    List<Group> groups = (from r in db.Groups select r).ToList(); 

    return groups; 
} 

你明白了Items現藏填充(詳見Using DataLoadOptions to Control Deferred LoadingLINQ to SQL, Lazy Loading and Prefetching)當你打電話給你的服務?

+0

是的,就是這樣!謝謝=) – xx77aBs 2012-08-11 16:16:23

+0

是否有可能以某種方式指定我想要一切加載? – xx77aBs 2012-08-12 13:54:03