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

时间:2016-02-01 03:40:57

标签: c# linq odata

我认为标题解释了一切,但这是我想从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。

有什么想法吗?问候。

1 个答案:

答案 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协议可能过于复杂。