2015-02-05 3 views
1

내 화면에서 고객 회사에 대한 정보를 보여주는 표가 있습니다. 이제 회사 X의 사용자가 회사 Y 또는 Z의 정보가 아니라 회사 X의 정보 만 볼 수 있도록 데이터 소스를 필터링하려고합니다. aspnet_User의 GUID가 포함 된 테이블 (CustomerUser)을 만들었습니다. , 그리고 회사가 여러 사용자를 생성 할 수 있도록 CustomerID.사용자가 자신의 정보 만 볼 수 있도록 데이터 원본 필터링

여기는 내가 지금까지 가지고 있지만 StackOverflowException을 throw하므로 무한 루프에 걸린 것으로 보입니다.

partial void Customers_Filter(ref Expression<Func<Customer, bool>> filter) 
    { 
     //if (!Application.Current.User.HasPermission(Permissions.SecurityAdministration)) 
     //{ 
      //Guid guid = (Guid)Membership.GetUser().ProviderUserKey;     
      Guid guid = new Guid("1657d378-4b8b-ed4e-f928-bb48fc83bf18"); 

      IEnumerator cusUsers = this.CustomerUsers.GetEnumerator(); 

      CustomerUser current; 
      CustomerUser found = null; 
      while (cusUsers.MoveNext()) 
      { 
       current = (CustomerUser)cusUsers.Current; 

       if (current.GebruikerID == guid) 
       { 
        found = current; 
       } 
      }; 

      try 
      {     
       if (found != null) 
       { 
        filter = e => e.CustomerID == found.Customer1.CustomerID; 
       } 
       else 
       { 
        filter = e => e.CustomerID == "-1"; 
       } 
      } 
      catch (Exception ex) 
      { 

      } 

     //} 
    } 
+0

"where guid = userguid"조건으로보기를 만들려면 사용자가 기본 테이블이 아닌보기에만 액세스 할 수 있도록하십시오. – jarlh

+0

나는 무슨 뜻인지 잘 모르겠다. 나는 아주 오랫동안 Lightswitch에서 일하지 않았다. – joepkerste

+0

어느 쪽도 가지고 있지 않습니다 ... 내 의견은 일반적인 해결책에 가깝습니다. 특정 사례에서 작동하는지 여부조차 모릅니다. – jarlh

답변

0

: 나는 새 쿼리를 추가 한 그 대신 데이터 세트를 필터링의 전처리,이 고정 내 문제. 이렇게 :

partial void CustomersByLoggedInUser_PreprocessQuery(ref IQueryable<Customer> query) 
    { 
    if (!Application.Current.User.HasPermission(Permissions.SecurityAdministration)) 
    { 
     Guid guid = (Guid)Membership.GetUser().ProviderUserKey;     

     IEnumerator cusUsers = this.CustomerUsers.GetEnumerator(); 

     CustomerUser current; 
     CustomerUser found = null; 
     while (cusUsers.MoveNext()) 
     { 
      current = (CustomerUser)cusUsers.Current; 

      if (current.GebruikerID == guid) 
      { 
       found = current; 
      } 
     }; 

     try 
     {     
      if (found != null) 
      { 
       filter = e => e.CustomerID == found.Customer1.CustomerID; 
      } 
      else 
      { 
       filter = e => e.CustomerID == "-1"; 
      } 
     } 
     catch (Exception ex) 
     { 

     } 

    } 
} 
0

CustomerUsers의 열거 자에는 버그가있을 가능성이 큽니다.

그러나 올바른 사용자를 찾을 때 break을 추가해야합니다.

 while (cusUsers.MoveNext()) 
     { 
      current = (CustomerUser)cusUsers.Current; 

      if (current.GebruikerID == guid) 
      { 
       found = current; 
       break; // stop searching 
      } 
     }; 

또는

좋아는이 질문에 걸림돌 같은 isue을 가진 사람에 대한
 while (found == null && cusUsers.MoveNext()) 
     { 
      current = (CustomerUser)cusUsers.Current; 

      if (current.GebruikerID == guid) 
      { 
       found = current; 
      } 
     }; 
+0

안녕하세요 Richard, 답변 해 주셔서 감사합니다. 그러나 StackoverflowException을 수정하지 않은 것 같습니다. 나는 휴식을 떠날 것이다. 코드에서, 나는 그것을 추가하는 것을 생각하지 않았다. – joepkerste

관련 문제