我有一个odata调用,它第一次正常工作,但由于属性不匹配,在任何后续调用中都会失败。我的控制器几乎没有逻辑,因为它只负责调用我的域服务来查询实体框架数据库,并将结果作为视图模型返回。然而,当我尝试排序时,我会得到一个错误,因为我的视图模型的层次结构与我的域模型不匹配。
领域模型:
public class Parent
{
public object Child
{
public string Name
}
}
视图模型:
public class Parent
{
public string ChildName
}
使用上面的例子,EF查询将返回一个Parent列表,我将把它转换为视图模型发送给客户端。当对ChildName进行排序请求时,odata失败,因为Parent没有ChildName的概念。我需要将ChildName映射到Child.Name。我见过一些人使用EntitySet更改名称的例子,但在我的情况下,没有一个能映射模型。
在查询过程中,我最终使用EF将域模型转换为使用LINQ表达式的视图模型。示例,但将视图模型更改为ParentView,并添加了构造函数:
var query = from p in context.Parent select new ParentView(p.Child.Name)
这样做的好处是,它都在数据库上运行,所以我不会传输不必要的数据。此外,我可以继续在查询中使用odata选项,因为odata将添加到查询中。然而,我忍不住觉得这不是最好的方式。