O对客户端定义的动态属性进行数据过滤

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

我在服务器中定义了两个实体:

public partial class MyModel 
{
    public string ModelCode { get; set; }
    public virtual ICollection<MyModelSubItem> SubItems { get; set; } = new HashSet<MyModelSubItem>();
    [NotMapped]
    public IDictionary<string, object> DynamicProperties { get; set; }
}

public partial class MyModelSubItem
{
    public string SubItemCode { get; set; }
}

控制器具有以下功能:

[EnableQuery]
public IQueryable<MyModel> Get()
{
    return _myModelContext.GetAll();
}

客户端,我扩展

MyModel

public partial class MyModel 
{
    public int SubItemCount => SubItems.Count;
}

当我尝试使用客户端定义的

SubItemCount
属性查询数据库时,出现以下错误

查询:

/odata/v1/MyModel?$filter=true&$orderby=SubItemCount%20desc

错误:

System.ArgumentException: Static property requires null instance, non-static property requires non-null instance. (Parameter 'instance')

使用非动态属性进行查询效果很好。当请求包含动态属性时,即使添加/修补也可以正常工作。只是过滤/排序不起作用。

我正在使用 OData v4 和 Unchase OData 客户端代码生成器。

我想知道为什么会出现这种情况。任何帮助将不胜感激。

c# asp.net-core odata
1个回答
0
投票

您遇到的错误似乎与 OData 客户端代码生成器如何处理客户端模型中的扩展属性有关。

在您的情况下,SubItemCount 是一个计算属性,未直接映射到数据库中的列,并且它依赖于 SubItems.Count。但是,OData 客户端代码生成器可能无法将此计算属性转换为可针对数据库执行的有效查询表达式。

要解决此问题,您可能需要考虑不同的方法。由于 SubItemCount 不是数据库支持的属性,因此您无法在数据库查询中直接按它进行筛选或排序。一种解决方法是从数据库中获取数据,而不按 SubItemCount 进行过滤或排序,然后在获取数据后在客户端执行过滤和排序。

另一个选择可能是修改服务器端模型以包含在服务器端计算并映射到数据库中的列的 SubItemCount 属性。这样,您就可以直接在 SubItemCount 上查询,没有任何问题。

但是,如果您仍然希望将 SubItemCount 仅保留为客户端的计算属性,则可能需要找到一种方法在客户端手动构造查询,而不依赖于生成的代码。这可能涉及手动构建 OData 查询 URL 或使用不同的方法与 OData 服务交互。

此外,您可能需要检查 Unchase OData 客户端代码生成器的文档或支持资源,以查看是否有任何用于处理客户端模型中的计算属性的特定建议或配置。

© www.soinside.com 2019 - 2024. All rights reserved.