2015-01-05 2 views
0

저는 바람을 사용하는 데 매우 익숙하며, 현재 매우 간단하게 보이는 무언가에 집착했습니다.breeze 쿼리 where 절이 실행되지 않습니다.

4 개 위치를 반환하는 API 호출이 있습니다. 바람을 이용하여 다음, 나는 다음과 같이 where 절을 사용하여 아래로 필터링하기 위해 노력하고있어 :

이상적으로
function getLocations(clientId) { 
     var self = this; 
     return EntityQuery.from('GetLocations') 
          .withParameters({ clientId: clientId }) 
          .where("activeStatus", "==", "0") 
          .expand('LocationType') 
          .using(self.manager) 
          .execute() 
          .then(querySucceeded, this._queryFailed); 

     function querySucceeded(data) { 
      if (data.results.length > 1) { 
       locations = data.results; 
      } 
      return locations; 
     } 
    } 

이 나에게 0 행을 제공해야합니다, 4 행의 'activeStatus은'그러나 1이기 때문에, 그것을 여전히 4 가지 결과를 모두 보여줍니다. 나는 locationType을위한 또 다른 필터를 사용해 보았습니다. 그리고 그것은 같은 결과입니다. breeze side where 절이 실행되지 않습니다. 질문에 대한 답변을

업데이트 :

public object GetLocations(int clientId) { 
} 

이 보시다시피 그것은 단지 매개 변수로 클라이언트 ID를 받아 따라서 나는 with parameter 절을 사용 : 다음

처럼 내 컨트롤러에서 API 호출 모습입니다 . 나는 breeze가 activeStatus where 절을 처리 할 것이라고 생각하고 있었고 백엔드에서 필터를 수행 할 필요가 없습니다. 틀렸어?

다른 사람이 도와 줄 수 있습니까?

+0

어떤 백엔드를 사용하고 있습니까?요청이 어떻게 보이는지 보여 줄 수 있습니까 (URL 및 쿼리 문자열 매개 변수 포함)? 문제는 백엔드에서 where 절을 적용하는 방법을 모르는 것입니다. –

답변

0

Breeze 설명서는 withParameters가 일반적으로 oData URI를 인식하지 않는 비.NET 백엔드 또는 서버와 함께 사용됨을 나타냅니다. .withParameters 때문에 where 절이 무시되고있을 가능성이 있습니까? clientID 필터를 사용하여 where 절을 다시 쓸 수 없습니까?

function getLocations(clientId) { 
    var self = this; 
    var p1 = new breeze.Predicate("activeStatus","==","0"); 
    var p2 = new breeze.Predicate("clientId","==",clientId); 
    var p = p1.and(p2) 
    return EntityQuery.from('GetLocations') 
         .where(p) 
         .expand('LocationType') 
         .using(self.manager) 
         .execute() 
         .then(querySucceeded, this._queryFailed); 

    function querySucceeded(data) { 
     if (data.results.length > 1) { 
      locations = data.results; 
     } 
     return locations; 
    } 
} 

나는 이것을 먼저 시도 할 것이다. 백엔드에 따라 where 절을 withParameters 문에 넣으십시오. 그래도 작동하지 않으면 다른 옵션이있을 수 있습니다.

행운을 비네.

편집 :

이것은 내가 대해 쿼리 API를 엔드 포인트입니다 : 내가 사용하는 예

 // qFilters is object. Values are arrays or strings, keys are id fields. SeasonClients might also be Clients 

     // Setup predicates 
     var p, p1; 
     // link up the predicates for passed data 
     for (var f in qFilters) { 
      var compareOp = Object.prototype.toString.call(qFilters[f]) === '[object Array]' ? 'in' : '=='; 
      if (!qFilters[f] || (compareOp == 'in' && qFilters[f].length == 0)) continue; 
      fLC = f.toLowerCase(); 
      if (fLC == "countryid") { 
       p1 = breeze.Predicate("District.Region.CountryId", compareOp, qFilters[f]); 
      } else if (fLC == "seasonid") { 
       p1 = breeze.Predicate("SeasonId", compareOp, qFilters[f]); 
      } else if (fLC == "districtid") { 
       p1 = breeze.Predicate("DistrictId", compareOp, qFilters[f]); 
      } else if (fLC == "siteid") { 
       p1 = breeze.Predicate("Group.Site.SiteId", compareOp, qFilters[f]); 
      } else if (fLC == "groupid") { 
       p1 = breeze.Predicate("GroupId", compareOp, qFilters[f]); 
      } else if (fLC == "clientid" || fLC == 'seasonclientid') { 
       p1 = breeze.Predicate("ClientId", compareOp, qFilters[f]); 
      } 
      // Setup predicates 
      if (p1) { 
       p = p ? p.and(p1) : p1; 
      } 
     } 

     // Requires [BreezeQueryable(MaxExpansionDepth = 10)] in controller 
     var qry = breeze.EntityQuery 
        .from("SeasonClients") 
        .expand("Client,Group.Site,Season,VSeasonClientCredit,District.Region.Country,Repayments.RepaymentType") 
        .orderBy("DistrictId,SeasonId,GroupId,ClientId"); 
     // Add predicates to query, if any exist 
     if (p) qry = qry.where(p); 

     return qry; 
: 여기

// GET: breeze/RST_ClientHistory/SeasonClients 
     [HttpGet] 
     [BreezeQueryable(MaxExpansionDepth = 10)] 
     public IQueryable<SeasonClient> SeasonClients() 
     { 
      return _contextProvider.Context.SeasonClients; 
     } 

가 그리고 내가 사용하는 쿼리의 예입니다

그 이상의 시간이 필요합니다. 그러나 여기에 완전한 예제가 있는지 확인하고 싶습니다. .withParameters를 사용할 이유가 없음을 알 수 있습니다. 컨텍스트가 서버에 올바르게 설정되어있는 한, 체인 조건부 (where 절)는 잘 작동해야합니다. 이 경우 qFilters 객체에서 전달되는 항목에 따라 엄격한 동일성으로 필터링하는 AND 또는 컬렉션에서 IN으로 최대 10 개의 AND 절을 생성합니다.

백엔드 컨트롤러의 매개 변수를 없애고 매개 변수없는 메서드를 만들고 클라이언트 Id 일치를 쿼리의 추가 조건 자로 포함시켜야한다고 생각합니다.

이 방법을 사용하면 API 끝점을 훨씬 더 유연하게 만들 수 있습니다. ClientId와 관련이 없더라도 다양한 쿼리에 사용할 수 있습니다.

이 정보가 도움이됩니까? 질문이 더 있으시면 알려주세요.

+0

감사합니다. 나는 확실히 그것을 시도 할 것이다. API 호출에서 매개 변수 clientID가 필요한 경우에도 접미사가됩니까? – devC

+1

불행히도 나는 백엔드에 대해 많이 모른다. 무엇이 백엔드에 영향을 미치고 있으며 쿼리하는 API 엔트리 포인트는 무엇입니까? odata 가능 서버가 아닌 경우 where 절을 이해하지 못하며 모든 쿼리가 매개 변수에 의해 수행되기를 기대하는 경우 api 내에서 정의되어야합니다. API에 액세스 할 수 있습니까? 아니면 외부 그룹에 속해 있습니까? – Beartums

+0

API는 혼자서 작성되었으며 질문에 코드를 포함 시켰습니다. 아마 나는 그것을 잘못하고있다. Look and advice, – devC

관련 문제