使用服务体系结构中的相关数据集来获取/返回数据

时间:2011-12-07 18:19:22

标签: c# .net wcf soa

这就是我的.EDMX外观

Entity
    int Prop1;
    String Prop2;
    EntityCollection<ChildEntity1> Children;
    EntityCollection<ChildEntity2> OtherRelatedData;

当然,在我的服务层中这很有效,我可以通过简单地使用.Children.OtherRelatedData的属性来执行业务逻辑,因为它们仍然是IQueryable我可以投影它们我的内心没有问题。我的问题是这个;我的服务如何公开这些相关数据?让我更进一步定义问题。

ChildEntity1记录的数量将永远增长,因此当服务请求的客户Entity我不想简单地.ToList()时,因为可能存在数千个相关行(一般来说,只有最近的10-100才有用)。

我正在尝试在这两种方法之间做出决定:

选项一

// Service Code
public EntityDTO ReadEntity(int id)
{
    // return Entity based on id with both child properties null
}
public IEnumerable<ChildEntity1DTO> ReadChildEntity1s(int parentID, int take, int skip)
{
    // return ChildEntity1DTOs starting at skip and returning only at most take
}
public IEnumerable<ChildEntity2DTO> ReadChildEntity2s(int parentID, int take, int skip)
{
    // return ChildEntity2DTOs starting at skip and returning only at most take
}

// consumer code
var ent = svc.ReadEntity(3);
var Entity = new 
{
    Prop1 = ent.Prop1,
    Prop2 = ent.Prop2
    Children = svc.ReadChildEntity1s(3, 10, 0),
    OtherRelatedData = svc.ReadChildEntity2s(3, 10, 0)
};

选项二

// Service Code
public EntityDTO ReadEntity(int id, int takeChild1, int skipChild1, int takeChild2, int skipChild2)
{
    // do projection of data here and return one DTO fully pre-populated
}

// client
var e = svc.ReadEntity(3, 10, 0, 10, 0);

我倾向于选项一,只是因为它会让客户端请求额外的相关记录,从而更容易在客户端上进行分页。为了支持选项二的相同分页,我还必须添加Option One中的所有相同代码。使用选项一,如果消费者默认对它不感兴趣而不必指定跳过零,则我会获得跳过所有相关数据的额外好处,为每个相关集取零。

在服务架构中使用DTO处理此类情况是否有更好的方法?

1 个答案:

答案 0 :(得分:0)

  

我倾向于选项一,只是因为它会在客户端上进行分页

我希望你是一名实习生。

您是否意识到您可以将IQueryable AS IQUERYABLE暴露给客户端,然后客户端可以使用正常的Skio / Take LINQ运算符?

你不知道WCF可以将IQueryable映射到OData查询字符串吗?通过URL中的参数使用户自动定义排序,条件,过滤,分页?

几年前,你尝试解决问题的问题以开放标准解决了。

http://www.c-sharpcorner.com/uploadfile/dhananjaycoder/introduction-to-wcf-data-service-and-odata/

有一个良好的开端。