有没有一种ODATA查询转换成LINQ表达式的方法(ODATA转换成LINQ)?

11
基本上,我想将odata查询表达式"$filter", "itemID eq 1"转换为where(w=>w.itemID==1)
是否有现成的库可以执行此操作?否则,我需要使用DynamicLinq类和linqKit编写代码。
3个回答

11

我正在使用Microsoft WebAPI,并安装了以下NuGet程序包:

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,在该API中检索具有ID为1的项的URL将如下所示:

/api/items/1

如果我基于集合中的其他属性进行查询,或者像以下示例中检索前10条记录时,请仅在项目集合上使用oData查询。

$.ajax({ url: '/api/items', data: $.param({ '$top': 10 }) });

query.ApplyTo 似乎是我正在寻找的。我需要在 mono 上使用它。谢谢。 - Davut Gürbüz

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格式中的过滤器和排序


0

感谢您的贡献。一年后,这个问题就要十年了。我很高兴看到.NET库有所改进,即使在此期间我已经转向Java :) - Davut Gürbüz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接