gpt4 book ai didi

c# - 将 LINQ 与 OData AddQueryOption 相结合

转载 作者:行者123 更新时间:2023-11-30 16:06:57 25 4
gpt4 key购买 nike

OData 的局限性 (listed here) 阻止我向来 self 的 OData 源的数据集添加动态 where 子句。我找到了一个 previous post这回答了我对动态过滤器的查询,即使用带有自定义查询字符串的 AddQueryOption 方法。但是,似乎没有办法将此查询字符串与标准 LINQ 查询结合起来。

使用上述方法生成有效查询:

https://api-dev.company.com/odata/Assets?$filter=(Levels/any(l:l/LevelId eq 18)) or (Levels/any(l:l/LevelId eq 19))

之所以必须动态生成它,是因为存在可变数量的级别过滤器,这些过滤器在运行时之前无法确定,并且简单地使用多个 Where 子句会生成“and”过滤器而不是“or”过滤器,如下所示:

https://api-dev.company.com/odata/Assets?$filter=(Levels/any(l:l/LevelId eq 18)) and (Levels/any(l:l/LevelId eq 19))

在此方法产生以下输出后,我目前尝试使用 LINQ:

https://api-dev.company.com/odata/Assets?$filter=DisplayOnline and Status eq Tools.Services.Models.EPublishStatus'Active', and (Levels/any(l:l/LevelId eq 18)) or (Levels/any(l:l/LevelId eq 19))

请注意,第二个查询唯一的问题是级别过滤器和其余过滤器之间的逗号。

附加的Where子句如下:

// Filter by assets that can be displayed online
assets = assets.Where(a => a.DisplayOnline);

// Filter by assets that are active
assets = assets.Where(a => a.Status == EPublishStatus.Active);

我想知道是否有手动编辑字符串的方法,或者是否有结合两种查询字符串生成方法的正确方法。感谢您的宝贵时间。

最佳答案

经过反复试验,我发现利用解决方案 answered here帮助解决了这个问题。我的解决方案是在 LINQ Where 子句之后构建动态过滤器查询,然后使用两者的组合结果构建一个全新的查询:

// Filter by assets that can be displayed online
assets = assets.Where(a => a.DisplayOnline);

// Filter by assets that are active
assets = assets.Where(a => a.Status == EPublishStatus.Active);

// Addtional filters..
assets = assets.Where(a => x == y);

// Get the string for the dynamic filter
string dynamicQuery = GetDynamicQuery(assets);

// Get base OData Asset call (https://api-dev.company.com/odata/Assets)
IQueryable<Asset> serviceCall = _container.Assets;

// Apply the new dynamic filter
serviceCall = serviceCall.AddQueryOption("$filter", dynamicQuery);

// Resultant OData query (Success!)
https://api-dev.company.com/odata/Assets?$filter=DisplayOnline and Status eq Models.Status'Active' and (Levels/any(l:l/LevelId eq 18)) or (Levels/any(l:l/LevelId eq 19))

这里的技巧是确保查询中只有一个“$filter”选项,否则会抛出异常。

关于c# - 将 LINQ 与 OData AddQueryOption 相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31513389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com