从WCF服务检索数据

时间:2012-08-11 13:09:57

标签: wcf linq-to-sql

假设我有两个表格的数据库 - GroupsItems

  • Groups只有两列:IdName
  • Items有三列:IdGroupIdName

如您所见,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;
    }

我在调试时检查过,Group函数中的每个GetAllGroups()对象都有它的项目,但是在客户端收到它们之后 - 每个Items属性都设置为null

1 个答案:

答案 0 :(得分:2)

最有可能的是,您遇到了Linq-to-SQL的默认“延迟加载”行为。当您调试并查看.Items集合时,会导致项目被加载。但是,当您的服务代码正常运行时,这不会发生。

然而,你可以强制执行这些项目的“急切加载” - 尝试这样的事情: (有关详细信息,请参阅Using DataLoadOptions to Control Deferred LoadingLINQ to SQL, Lazy Loading and Prefetching

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集合?