基本上,
我想将 odata 查询表达式"$filter", "itemID eq 1" 转换为where(w=>w.itemID==1)
是否有用于此操作的现成库?否则我需要使用 DynamicLinq 类和 linqKit 对其进行编码。
我正在使用安装了以下 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 }) });
您可以使用以下 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