映射到服务器上的 DTO 时使用 expand in breeze
use of expand in breeze when mapping to DTOs on the server
为了满足复杂授权的要求,我不得不将查询从主数据库中移出 - 例如,具有给定授权角色的用户只能查看同一机构中个人的数据。
我正在使用 Breeze .net DocCode sample 作为指导,并复制了将域模型映射到 DTO 的前提。
get { return ForCurrentUser(Context.Orders).Select(o => new Order {
OrderID = o.OrderID,
....
OrderDetails = o.OrderDetails.Select(od => new OrderDetail
{
ProductID = od.ProductID,
UnitPrice = od.UnitPrice
...
})
问题是映射属性到.include(entity framework方法)/.expand(breeze方法)现在是映射函数的关注点(例如上面的代码总是return OrderDetails 集合,无论我是否需要它们)。如果 javascript 客户端生成的谓词具有针对 属性.
的 .expand 指令,我仍然只想热切地 load/expand 属性
这是完全可能的,还是我坚持在服务器上手动定义不同的映射函数,具体取决于我想要扩展的属性? (如果可以解决或简化问题,我很乐意使用 automapper 等工具)
谢谢
您需要使用 ODataQueryOptions 作为控制器方法的参数。这为您提供了服务器方法中查询谓词的详细信息,以便您可以根据需要应用它们,而不是让它们自动应用。这将让您根据查询展开或不展开。
请参阅 and this answer 了解其工作原理。
为了满足复杂授权的要求,我不得不将查询从主数据库中移出 - 例如,具有给定授权角色的用户只能查看同一机构中个人的数据。
我正在使用 Breeze .net DocCode sample 作为指导,并复制了将域模型映射到 DTO 的前提。
get { return ForCurrentUser(Context.Orders).Select(o => new Order {
OrderID = o.OrderID,
....
OrderDetails = o.OrderDetails.Select(od => new OrderDetail
{
ProductID = od.ProductID,
UnitPrice = od.UnitPrice
...
})
问题是映射属性到.include(entity framework方法)/.expand(breeze方法)现在是映射函数的关注点(例如上面的代码总是return OrderDetails 集合,无论我是否需要它们)。如果 javascript 客户端生成的谓词具有针对 属性.
的 .expand 指令,我仍然只想热切地 load/expand 属性这是完全可能的,还是我坚持在服务器上手动定义不同的映射函数,具体取决于我想要扩展的属性? (如果可以解决或简化问题,我很乐意使用 automapper 等工具)
谢谢
您需要使用 ODataQueryOptions 作为控制器方法的参数。这为您提供了服务器方法中查询谓词的详细信息,以便您可以根据需要应用它们,而不是让它们自动应用。这将让您根据查询展开或不展开。
请参阅