13

現在、BreezeJs のドキュメント / 例に示されているように、すべてのデータ クエリを呼び出しています。

getEntityList = function (predicate) {
  var query = new entityModel.EntityQuery().from("EntityList");
  if (predicate)
    query = query.where(predicate);
  return manager.executeQuery(query);
}

しかし、クエリ可能な結果が返される前に、コントローラーアクションに追加のパラメーターを渡したい:

[AcceptVerbs("GET")]
public IQueryable<Entity> EntityList(string actionParam) {
  //here goes logic that depends on actionParam
  //and returns IQueryable<Entity>
}

ドキュメントからわかるように:

Breeze はクエリを次のような OData クエリ文字列に変換します。

?$filter=IsArchived%20eq%20false&$orderby=CreatedAt

ここから問題が始まります。パラメータをコントローラアクションに渡すクエリを作成するにはどうすればよいですか?

getEntityList = function (predicate, actionParam) {
  var query = new entityModel.EntityQuery().from("EntityList");
  if (predicate)
    query = query.where(predicate);
  if(actionParam)
    // ???
  return manager.executeQuery(query);
}

私はすでにルートを次のように設定しようとしました:

routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{actionParam}",
            defaults: new { query = RouteParameter.Optional }
        );

fromセクションに適用してactionParamを送信し、

var query = new entityModel.EntityQuery()
  .from("EntityList/" + encodeURIComponent(actionParam));

しかし、いくつかの特別な文字でエンコーディングが失敗し、不正なリクエストがスローされています。

このようなシナリオでactionParamを適切に送信するにはどうすればよいですか? 助けてください。

4

2 に答える 2

24

As of v 0.76.1, you can use the EntityQuery.withParameters method to pass additional parameters to any service method. So you can now construct a query like the following that both passes parameters and uses breeze's IQueryable support.

EntityQuery.from("EmployeesFilteredByCountryAndBirthdate")
                 .withParameters({ BirthDate: "1/1/1960", Country: "USA" })
                 .where("LastName", "startsWith", "S")
                 .orderBy("BirthDate");

where your controller method would look something like this:

[HttpGet]
public IQueryable<Employee> EmployeesFilteredByCountryAndBirthdate(DateTime birthDate, string country) {
      return ContextProvider.Context.Employees.Where(emp => emp.BirthDate >= birthDate && emp.Country == country);
}

The API docs have more information.

于 2012-12-10T01:46:18.360 に答える
6

更新: BREEZE v.0.76.1 の時点で、これはもはや正しい答えではありません。BREEZE はクエリのパラメーターをサポートするようになりました。「withParameters」クエリ句を参照してください。

SO に関するこの質問のおかげもあって、パラメータ化されたクエリのサポートが Breeze に追加されました。ありがとうございました。

この回答は、不要になった回避策を説明するために使用されていました。回答を修正し、その回避策の説明を削除しました。

于 2012-12-05T00:33:30.210 に答える