風が 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 コードが制御できるようになります。
これは本当に Breeze の問題ではなく、odata の問題であると認識していますが、他の人はこれにどのように対処していますか? iQueryable をあきらめて、webapi を作成して json を返すだけですか? もしそうなら、スキップ\テイクとオーダーバイも処理する必要があるので、車輪を再発明しています。
提案に感謝します:)よろしくお願いします、マイク
解決済み
TotalCount を失わずに WCF を iQueryable として渡す方法がないことがわかりました。WCF は、そよ風に戻すことができる QueryOperationResponse を返していますが、風によってオブジェクトにキャストすると、Breeze の QueryHelper.WrapResults で動的型を使用可能なオブジェクトにキャストして、拡張された TotalCount プロパティを取得する方法が見つかりませんでした.
QueryHelper はクエリを実行します
queryResult = Enumerable.ToList((dynamic)queryResult)
しかし
request.Properties.TryGetValue("MS_InlineCount", out tmp)
基になるオブジェクトが間違っているため失敗します。
私の解決策は、BreezeController でクエリを実行し、Breeze のように行と TotalCount を配列にラップすることでした。次に、配列を QueryResult 型として返すと、breeze がクライアントに対して 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;
}