我是 Odata 和 EntityFramework 的新手,我正在尝试将 OData 与 DTO 结合使用。我的实体模型的定义类似于
public Orders
{
public String OrderId{get; set;}
public List<Item>? Items{get;set;}
}
public Item
{
public String ItemId{get; set;}
public String ItemType{get; set;}
}
我的查询是这样的
_db.Orders.Select(o => new OrdersDTO
{
OrderId = o.OrderId,
// This works if I dont register Item DTO in my Odata EDM model
// Even if I comment this I still get the same error
Items = o.Items.Select(i => new Item
{
ItemId = i.ItemId,
ItemType = i.ItemType
}).ToList()
}
现在,即使我没有在查询的选择中提到该项目,它也会给我一个错误,即创建查询字符串时出错:
Error creating query string: The LINQ expression '$it => new SelectAll<Item>{
Model = __TypedProperty_2,
Instance = $it,
UseInstanceForProperties = True
}
我理想地希望 Odata 动态创建一个仅获取所需数据的 SQL 查询。就像直接实体的情况一样。
我尝试了https://github.com/dotnet/efcore/issues/27460其中一种解决方案说将空传播设置为 false,但我仍然面临同样的错误。
我觉得我没有从根本上理解 DTO 的定义方式。
使用 EF 映射技术,如
您的 EF 实体不必与底层数据库表完全相同。 因此,您可以放弃 DTO 并在 EF 模型配置中维护映射层,使 OData 能够直接针对模型生成查询。