我认为标题解释了一切,但这是我想从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(参数): g“string
My model Genre ipmlements IEquatable。
有什么想法吗?问候。
答案 0 :(得分:1)
我们习惯于LINQ表达式,我们有时会忘记在外部服务的情况下,必须有一个能够解释应用程序发送给它的表达式的LINQ提供程序。 SQL数据库.NET驱动程序通常足够用于此类查询,但即使是丰富的Microsoft SQL服务器和Oracle .NET驱动程序也可能在复杂的LINQ表达式上失败,该表达式在内存查询中运行良好。
话虽如此,让我们来看看你发送给OData Filter子句的表达式:p =&gt; p.Genres.Any(g =&gt; Genres.Contains(g))。您正在向表达式发送类型列表,并希望检查某些集合中的至少一个元素是否包含在类型中。虽然OData支持Any / All子句,但我不确定上述表达式是否可以写为OData V3或V4服务支持的OData URI。我可能错了,但您可以尝试编写与您的请求相对应的OData URI查询,将其粘贴到浏览器中并再次运行您的OData服务吗?如果是这样,那么这是我可以尝试修复的Simple.OData.Client限制,但我怀疑这个表达式对于当前的OData协议可能过于复杂。