C# 将$filter从oData参数映射到linq,其中

C# 将$filter从oData参数映射到linq,其中,c#,linq,odata,infragistics,ignite-ui,C#,Linq,Odata,Infragistics,Ignite Ui,我得到的(我认为是odata格式)url如下: http://localhost:2282/SSE.Web/History.cshtml?GetData=true&itemId=AKE-00129&pid=1&%24filter=indexof(ItemType%2C%27Attri%27)+ge+0&%24skip=0&%24top=50&%24inlinecount=allpages&_=1325589443808 这里有趣的是$fi

我得到的(我认为是odata格式)url如下:

http://localhost:2282/SSE.Web/History.cshtml?GetData=true&itemId=AKE-00129&pid=1&%24filter=indexof(ItemType%2C%27Attri%27)+ge+0&%24skip=0&%24top=50&%24inlinecount=allpages&_=1325589443808
这里有趣的是$filter参数。它的格式为“indexof(ItemType,'Attri')ge 0”

源是一个网格(infragistics中的iggrid),它在ItemType列上过滤文本“Attri”

我的问题是:映射top和skip参数很简单,但是如何进行过滤。我需要解析它并构建自己的linq,还是有其他方法

这是我目前掌握的代码:

        var skip = int.Parse(Request["$Skip"]);
    var top = int.Parse(Request["$top"]);
    var filter = Request(["$filter"]);

    var db = Database.Open("SSEConnectionString");

    var entries = db.Query("select * from eHistory order by timestamp desc")
    Json.Write(new { results = entries.Where(????).Skip(skip).Take(top), totalRecCount = entries.Count() }, Response.Output);
谢谢你的帮助


Larsi

如果您对igGrid使用MVC包装器,那么映射就为您完成了。以下引述自:

“使用ASP.NET MVC包装器绑定到服务器端数据时 通过LINQ(IQueryable),所有在 URL将自动转换为LINQ表达式子句(其中 子句),因此您无需执行任何其他操作即可 过滤数据。”


您可以使用以下NuGet包应用过滤器:

代码示例为:

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();
使用System.Linq;
使用Community.OData.Linq;
//本例中的数据集-任何可读取的
示例[]filterResult=dataSet.OData().Filter(“Id eq 2或名称eq'name3')).ToArray();

您正在使用WCF数据服务吗?这会帮你解决所有的问题。如果不是,试试看。不,我只是在使用WebMatrix提供的数据库mini-orm。我希望避免使用WCF数据服务。但是谢谢你的建议。这可能是最好的选择。问题是,以后当你想同时支持$expand和$select时,它会变得非常复杂。我还怀疑Json.Write是否会产生与OData兼容的有效负载。也许这不是你的目标,但如果是的话,它很快就会成为一个问题。@vitekkarasmssft说得好!我同意我以后会遇到问题的。我将使用wcf数据服务。我有一个类似的要求。当然,有一种方法可以重用WCF数据服务将odata过滤器转换为LINQ查询的机制。显然,WCF数据服务可以做到这一点。