这就是我的.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处理此类情况是否有更好的方法?
答案 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/
有一个良好的开端。