OData:通过按列表筛选二级导航来获取顶级集合

本文关键字:二级 导航 获取 集合 列表 筛选 OData | 更新日期: 2023-09-27 18:32:37

我认为标题解释了这一切,但这是我试图从 Simple.OData.Client 获得的内容;

public async Task<List<Party>> GetByGenres(List<Genre> Genres, params string[] expands)
    {
        IEnumerable<Party> rtn = null;
        try{
            rtn = await client.For<Party>("Party").Filter(p => p.Genres.Any(g => Genres.Contains(g))).FindEntriesAsync();
        }
        catch(Exception e){
        }
        return rtn.ToList();
    }

但它给了

消息"不支持类型的表达式" System.Linq.Expressions.TypedParameterExpression (Parameter(: g" 字符串

我的模型流派 ipmles IEquatable。

有什么想法吗?问候。

OData:通过按列表筛选二级导航来获取顶级集合

我们已经习惯了 LINQ 表达式,

以至于我们有时会忘记,对于外部服务,必须有一个能够解释应用程序发送给它的表达式的 LINQ 提供程序。SQL 数据库 .NET 驱动程序通常足以满足此类查询,但即使是Microsoft丰富的 SQL 服务器和 Oracle .NET 驱动程序也可能在复杂的 LINQ 表达式上失败,而该表达式在内存中查询上工作正常。

话虽如此,让我们看一下您发送到 OData Filter 子句的表达式:p => p.Genres.Any(g => Genres.Contains(g((。您正在向表达式发送流派列表,并希望检查某个集合中是否至少包含一个元素包含在流派中。虽然 OData 支持 Any/All 子句,但我不确定上述表达式是否可以编写为 OData V3 或 V4 服务支持的 OData URI。不过我可能是错的,但是您可以尝试编写与您的请求相对应的OData URI查询,将其粘贴到浏览器中并再次运行OData服务吗?如果是这样,那么这是一个 Simple.OData.Client 限制,我可以尝试修复,但我怀疑这个表达式对于当前的 OData 协议来说可能太复杂了。