OData“列表中的ID”查询

时间:2011-10-12 19:10:07

标签: linq collections filter odata

我有一个OData服务,我试图按ID列表过滤; SQL等价物将类似于:

SELECT * FROM MyTable WHERE TableId IN (100, 200, 300, 400)

我想要过滤的属性被输入为Int32。我尝试过以下操作,它给出了一个错误“操作符'添加'与操作数类型'Edm.String'和'Edm.Int32'不兼容”:

string ids = ",100,200,300,400,";
from m in provider.Media where ids.Contains("," + t.media_id + ",")

以及

string ids = ",100,200,300,400,";
from m in provider.Media where ids.Contains("," + t.media_id.ToString() + ",")

string ids = ",100,200,300,400,";
from m in provider.Media where ids.Contains("," + Convert.ToString(t.media_id) + ",")

string ids = ",100,200,300,400,";
from m in provider.Media where ids.Contains(string.Concat(",", t.media_id, ","))

如您所见,目前我正在使用LINQ来查询服务。

有没有办法可以做我正在尝试的事情,或者我是不是在构建文本过滤器并使用AddQueryOption,并在列表中迭代并手动添加“或media_id eq 100”子句?

4 个答案:

答案 0 :(得分:35)

请参阅接受的答案,以下所有内容均适用于OData v< 4.01

尝试这个

 var ids = new [] { 100, 200, 300 } ;
 var res = from m in provider.Media 
           from id in ids 
           where m.media_id == id 
           select m;

关于查询DataServices的msdn有一个全面的描述。

另一种方法是

var results = provider.Media
   .AddQueryOption("$filter", "media_id eq 100");

由于OData不支持IN语句,因此您将提出像这样的过滤条件

.AddQueryOption("$filter", "(media_id eq 100) or (media_id eq 200 ) or ...");

您可以使用循环或linq Selectstring.Join

构建
var ids = new [] { 100, 200, 300 };
var filter = string.Join(" or ", ids.Select(i=> $"(media_id eq {i})"));
var results = provider.Media.AddQueryOption("$filter", filter);

更新:有过滤操作field=["a","b"]但是它意味着不同的东西。

UPDATE2:在OData V4中有lambda表达式anyall,与数组文字["a", "b"]配对,它们可能作为in工作,但我无法提出使用OData.org上的v4端点的工作示例

答案 1 :(得分:19)

OData 4.01支持in语句,如下所示:

http://host/service/Products?$filter=Name in ('Milk', 'Cheese')

答案 2 :(得分:13)

扩展vittore的答案(其中第二部分是正确答案),我为演示项目编写了类似的内容:

var filterParams = ids.Select(id => string.Format("(media_id eq {0})", id));
var filter = string.Join(" or ", filterParams);
var results = provider.Media.AddQueryOption("$filter", filter).Execute().ToList();

它并不优雅,你不想将它用于大量的ID列表(> ~~60),但它会起作用。

答案 3 :(得分:0)

扩展MCattle建议如果我们需要更多50或60个ID,那么建议在2个或更多并行调用中进行并将它们添加到并发字典或类似的东西,因为我们从服务器获得结果。虽然这增加了对服务器的调用次数,但由于我们正在慢慢迁移到云环境,所以在我看来这应该不是一个大问题。