9

基本上,

我想将 odata 查询表达式"$filter", "itemID eq 1" 转换为where(w=>w.itemID==1)

是否有用于此操作的现成库?否则我需要使用 DynamicLinq 类和 linqKit 对其进行编码。

4

2 回答 2

12

我正在使用安装了以下 NuGet 包的 Microsoft WebAPI:

http://nuget.org/packages/Microsoft.Data.OData/

http://nuget.org/packages/microsoft.aspnet.webapi.odata

这让我可以写如下内容:

using System.Web.Http;
using System.Web.Http.OData.Query;

// Some stuff left out

[Queryable]
public IQueryable<Item> Get(ODataQueryOptions<Item> query)
{        
    var items = query.ApplyTo(from item in context.Items select item);
    return (IQueryable<Item>) items;
}

然后我可以使用 jQuery Ajax 调用它(为了示例,我更喜欢使用 BackboneJS),如下所示:

$.ajax({ url: '/api/items', data: $.param({ '$filter': 'ID eq 1' }) });

然后它将只返回 ID 等于 1 的项目,我认为这就是你所追求的?

如果 itemID 是您正在检索的对象的主 ID,我可能会遵循 REST 原则并创建 API,其中检索 ID 为 1 的项目的 url 将是:

/api/items/1

如果我基于集合中项目的其他属性进行查询,则仅对项目集合使用 oData 查询,或者在检索前 10 条记录时执行类似下面的操作。

$.ajax({ url: '/api/items', data: $.param({ '$top': 10 }) });
于 2013-03-21T00:34:38.773 回答
5

您可以使用以下 NuGet 包来应用过滤器: https ://www.nuget.org/packages/Community.OData.Linq

代码示例将是:

using System.Linq;
using Community.OData.Linq;

// dataSet in this example - any IQuerable<T> 
Sample[] filterResult = dataSet.OData().Filter("Id eq 2 or Name eq 'name3'").ToArray();

目前支持:v4 格式的 filter 和 orderby

于 2018-01-28T12:28:53.750 回答