2012-03-15 1 views
1

linq와 entityquery 및 ria 서비스의 상호 작용에 대한 일반적인 질문이 있습니다. 내 domainconext 내 응용 프로그램에 대한 쿼리를 정의 할 수 있음을 알고 있습니다. 예를 들어, 내 도메인 컨텍스트 내에서 linq을 사용하여 다음 쿼리를 정의 할 수 있습니다.Linq, EntityQuery 및 RIA 서비스의 상호 작용 설명

public IQueryable<User> GetUsersFriends(Guid usersID) 
    { 
     return (from f in this.ObjectContext.Friends join u in this.ObjectContext.Users on f.FriendUsersID equals u.ID where f.UsersID.Equals(usersID) select u); 
    } 

이 모든 것이 좋습니다. 하지만 내 질문은 클라이언트 측 (silverlight 앱)에서 동일한 유형의 쿼리를 수행 할 수 있습니까? 그래서 EntityQuery 객체에 대해 linq 문을 작성하고이 방식으로 데이터베이스에서 데이터를 리턴 할 수 있습니까?

이미이로드 된 엔티티 모음에서 linq 작업을 수행 할 수 있다는 것을 알고 있습니다. 클라이언트 측에서 linq을 사용하여 콜렉션을로드 할 수 있습니까?

궁극적으로 데이터베이스에 도달 한 모든 쿼리가 내 도메인 컨텍스트에 정의되어야한다고 생각합니까? 힘의 힘을 나는 새로운 쿼리를 정의하고 그것을 domaincontext.load() 작업에 전달하기 위해 linq를 사용하려고 노력하고있다 .... 비참하게 실패한다. domainconext는 아마 줄을 가로 지르는 쿼리를 마샬링 할 방법이 없을 것입니다 ... 맞습니까?

내 이해가 정확합니까? 누군가가 나를 위해 이것을 확인하는 데 도움이된다면, 나는 그것을 감사 할 것입니다.

답변

2

IQueryable의 주요 이점 중 하나는 클라이언트 측에서 쿼리를 만들고 서브 서버에서 처리하기 위해 서버에 직렬화 할 수 있다는 것입니다. 여기에 정의 된 형식을 반환해야합니다 (IQueryable 사용자가 IEnumerable <을 지원하는 컬렉션에서 반환해야하는 형식 인 경우)

Shawn Wildermuth (wildermuth.com)에서 예제를 가져 왔습니다.), 그리고 그것을 조금 불통이 내 클라이언트 측 "모델"에서 사용하는 것입니다

publicvoid PerformQuery<T>(EntityQuery<T> qry, EventHandler<EntityResultsArgs<T>> evt, object pUserState = null, bool NoRecordsThrow = False, LoadBehavior pLoadBehavior = LoadBehavior.MergeIntoCurrent) where T : Entity 
{ 

    ModelDataContext.Load<T>(
    qry, 
    pLoadBehavior, 
    r => 
    { 

     if (evt != null) 
     { 
     try 
     { 

      if (r.HasError) 
      { 

#if DEBUG 

      System.Diagnostics.Debugger.Break(); 

#endif 
      //internal class to record error messages 
      AppMessages.ErrorMessage.Display(string.Concat(r.Error.Message, Environment.NewLine, "------------------------", "------- Stack Trace ------", Environment.NewLine, r.Error.StackTrace)); 
      } 
      else if (r.Entities.Count() > 0 || NoRecordsThrow) 
      evt(this, new EntityResultsArgs<T>(r.Entities, r.UserState)); 
     } 
     catch (Exception ex) 
     { 
#if DEBUG 
      System.Diagnostics.Debugger.Break(); 
#endif 
      evt(this, new EntityResultsArgs<T>(ex)); 
     } 
     } 
    }, 
    pUserState); 
} 

을 나는 다음과 같이 사용 할 경우 :..

var UserQuery = <DomainServiceName>.Users.Where(pUser => pUsers.City == "Calgary"); 
PerformQuery<User>(UserQuery, UserQueryComplete) 

단점을하다이를 통해 하나의 엔드 포인트, 사용자 데이터 추출 가능 클라이언트 측에서 발행되는 필터의 종류와 D ....

HTH, 리처드

+0

당신에게 리처드 감사합니다. 이것은 나를 위해 약간 명확 해. 마지막으로 비슷한 일을 시도했을 때 즉시 이해가되지 않는 유형에 대한 오류 메시지가 나타났습니다. 귀하의 설명과 함께, 나는 그것이 내 문제를 해결했을 템플릿로드 (domaincontext.load )임을 이해합니다. 그러나 데이터베이스가 손상되는 방식을 제어하는 ​​것이 중요하므로 지금 당장은 도메인 컨텍스트에 모든 것을 넣으십시오. 보안에 대한 귀하의 의견을 이해하지 못했습니다. 그것을 설명 할 수 있습니까? 단지 내 자신의 교화를 위해서. –

+0

끝 점이 IQueryable로 노출되면 필터, 정렬 절 등을 사용하여 해당 엔터티에서 정보를 검색 할 수 있습니다. 사용자가 쿼리를 작성한 다음 해당 쿼리를 정보 검색을 위해 끝점에 전달할 수 있습니다. 이것은 추가 정보를 "포함"하거나 지연로드를 허용 할 때 더욱 위험 해집니다. 이 두 가지 모두 엔티티에서 시작하여 데이터 스키마로 이동하고 추가 정보를 검색 할 수 있음을 의미합니다. 이것은 IIS를 통해 공개되는 요지입니다. IIS가 공개이면 엔트리 포인트도 마찬가지입니다. 보안이 문제입니다. – codeputer