2012-08-11 89 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