将 OData Framework 与 DTO 结合使用时无法翻译 LINQ 表达式

问题描述 投票:0回答:1

我是 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 的定义方式。

c# entity-framework asp.net-web-api odata
1个回答
0
投票

使用 EF 映射技术,如

您的 EF 实体不必与底层数据库表完全相同。 因此,您可以放弃 DTO 并在 EF 模型配置中维护映射层,使 OData 能够直接针对模型生成查询。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.