1

風が 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;
}
4

1 に答える 1