C# 将$filter从oData参数映射到linq,其中
我得到的(我认为是odata格式)url如下: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
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数据服务可以做到这一点。