我在尝试过滤数据时遇到问题,因为微风在 URL 的末尾添加了 $filter 子句,并且 WCF\odata 服务正在抛出过滤器不能在 select 子句之后。
public IQueryable<order> Orders()
{
string owner= Membership.GetUser(Thread.CurrentPrincipal.Identity.Name).owner;
IQueryable<Consigne> q = this.db.Consignes
// .AddQueryOption("Dest", dest)
.Where(x => x.Owner == owner)
.Select(f => new order{ Name= f.Name, Address1 = f.Address1, Address2 = f.Address2, Address3 = f.Address3 });
return q;
}
我已经使用服务器端 Where 子句限制了结果集,并使用 Select 投影限制了字段。如果我删除这些并让微风完全控制 Where\Select 然后我会破坏我的安全模型,允许 js 代码进行控制。
我意识到这不是真正的微风问题,更多的是 odata 问题,但其他人如何处理这个问题?您是否只是放弃 iQueryable 而只是创建一个 webapi 并传回 json?如果是这样,那么我正在重新发明轮子,因为我还需要处理 skip\take 和 orderby。
欣赏建议:) 亲切的问候,迈克
解决了
我发现 WCF 无法在不丢失 TotalCount 的情况下作为 iQueryable 传递。WCF 正在返回一个 QueryOperationResponse,我可以将其传递回微风,但是一旦通过微风投射到一个对象,我就无法在 Breeze 的 QueryHelper.WrapResults 中找到将动态类型投射回一个可用对象以检索扩展的 TotalCount 属性.
QueryHelper 将执行查询
queryResult = Enumerable.ToList((dynamic)queryResult)
但
request.Properties.TryGetValue("MS_InlineCount", out tmp)
由于错误的基础对象而失败。
我的解决方案是在我的 BreezeController 中执行查询,并将行和 TotalCount 包装在一个数组中,就像 Breeze 一样。然后我可以将数组作为 QueryResult 类型传回,然后微风将序列化为 JSON 给客户端。
public QueryResult Consignees(string filter, int skip, int take)
{
WcfService.Context context = new WcfService.Context(new System.Uri(System.Configuration.ConfigurationManager.AppSettings["URI"]));
//Main Table
System.Data.Services.Client.DataServiceQuery<WcfService.Consigne> qMain = context.Consignes.IncludeTotalCount();
//Projected Table
System.Data.Services.Client.DataServiceQuery<Consigne> qProj = (System.Data.Services.Client.DataServiceQuery<Consigne>)qMain
.Where(x => x.Refname.StartsWith(filter))
.Skip(skip)
.Take(take)
.Select(f => new Consigne { Refname = f.Refname, Consignee = f.Consignee, Address1 = f.Address1, Address2 = f.Address2, Address3 = f.Address3 });
System.Data.Services.Client.QueryOperationResponse<Consigne> qResult= qProj.Execute() as System.Data.Services.Client.QueryOperationResponse<Consigne>;
QueryResult queryResult = new QueryResult() { Results = qResult.ToList(), InlineCount = qResult.TotalCount };
return queryResult;
}