2013-02-14 1 views
1

Caliburn.Micro를 사용하여 Silverlight 5 응용 프로그램을 개발 중입니다. 프레임 워크에서 SQL 테이블에서 일부 데이터를 읽어야합니다. 나는 WCF 데이터 서비스 (이유는 요점이다)를 선택했다.DataServiceQuery를 추가/변경하십시오.

일반적인 것을 만들고 재사용하기 위해 서비스의 DataServiceQuery<TEntity>URI을 가져 와서 데이터를로드하는 뷰 모델을 만들었습니다. 또한 데이터를 표시하는 데 RadelridView를 사용하고 자식 창에 뷰 모델을 표시하는 Caliburn IResult를 사용하여이 뷰 모델에 대한 뷰를 만들었습니다. 내 응용 프로그램에서 사용자가 큰 목록 (SQL 테이블)에서 무언가를 선택해야하는 필드가있는 많은 양식을 가지고 있으므로 테이블에서 항목을 선택해야 할 때마다이보기 모델과보기를 사용하고 싶습니다.

public class SelectDBEntitiesViewModel<TEntity, TContext> : DialogScreenBase, IAmClean 
     where TEntity : class, new() 
     where TContext : DataServiceContext 
    { 
     public SelectDBEntitiesViewModel() 
     { 
     } 

     public void Load() 
     { 
      // load 
     } 

     public DataServiceQuery<TEntity> Query{ get; set; } 

     public void Filter() 
     { 

      Query = _originalQuery.AddQueryOption("$filter", "startswith(" + _filterProperty + ",'" + FilterValue + "')"); 
      Load(); 
     } 
    } 

그래서 코 루틴에서 다른 뷰 모델에서 I는 다음과 같이이 IResult 클래스를 만들 :이 방법은 자식 창 열기, 뷰 모델이로드 데이터와이 실행

public IEnumerable<IResult> SelectInternalBeneficiary() 
    { 
     SelectDBEntitiesResult<InternalBeneficiary, QMSEntities> r = new SelectDBEntitiesResult<InternalBeneficiary, QMSEntities>(_oDataUri); 
     r.Query = (from ib in r.DataContext.InternalBeneficiaries where (ib.Firma == Model.GroupCompany) select ib) as DataServiceQuery<InternalBeneficiary>;   r.PageSize = 2; 
     r.ColumnSettingsName = UserSettings.SEL_INTERNALBENEFICIARIES_GRID; 
     r.Header = "SELECT AN INTERNAL BENEFICIARY"; 
     r.Subtitle = "List of all departments"; 
     yield return r; 
     Model.InternalBeneficiary = r.SelectedObject.DenumireDepartament; 
    } 

그래서 때 그리드가로드됩니다.

모든 것이 현재 정상적으로 작동하지만보기에는 쿼리에 새로운 절을 추가하여 데이터를 필터링하는 데 사용할 오른쪽 위 모서리에있는 텍스트 상자가 있습니다. 이것은 내 일반 SelectDBEntitiesViewModel 내부에서해야하지만 문제는이 뷰 모델이 사용하는 쿼리가 외부에서 매개 변수로 수신된다는 것입니다.

Query = _originalQuery.AddQueryOption("$filter", "startswith(" + _filterProperty + ",'" + FilterValue + "')"); 

을하지만 응용 프로그램을 실행할 때 나는 물론이 오류를 얻을 : 나는 필터 방식으로 다음과 같은 시도

Can't add query option '$filter' because it would conflict with the query options from the translated Linq expression. 

내가 무슨 일이 일어나고 있는지 이해를 (이미 where 절을 쿼리에서 및 다른 필터를 추가 할 수 없습니다)하지만 난 그것을 해결하는 방법을 모르겠습니다.

아이디어가 있으십니까?

답변

0

신경 끄시 고, 난 당신이 Expressions을 만들 수있는 방법을 찾아에 추가 관리하는 Query :

이 방법은이 방법이를 추가하는 IQueryable<T>

private IQueryable<T> StartsWithQuery<T>(IQueryable<T> query, string propertyValue, PropertyInfo propertyInfo) 
     { 
      ParameterExpression e = System.Linq.Expressions.Expression.Parameter(typeof(T), "e"); 
      MemberExpression m = System.Linq.Expressions.Expression.MakeMemberAccess(e, propertyInfo); 
      ConstantExpression c = System.Linq.Expressions.Expression.Constant(propertyValue, typeof(string)); 
      MethodInfo mi = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }); 
      System.Linq.Expressions.Expression call = System.Linq.Expressions.Expression.Call(m, mi, c); 
      Expression<Func<T, bool>> lambda = System.Linq.Expressions.Expression.Lambda<Func<T, bool>>(call, e); 
      return query.Where(lambda); 
    } 

에 필터링의 종류와 시작을 ​​추가 IQueryable<T>에 필터링의 유형과 같다 :

private IQueryable<T> EqualsQuery<T>(IQueryable<T> query, string propertyValue, PropertyInfo propertyInfo) 
     { 
      Expression<Func<T, bool>> additionalExpression = 
       System.Linq.Expressions.Expression.Lambda<Func<T, bool>>(
        System.Linq.Expressions.Expression.Equal(
         System.Linq.Expressions.Expression.MakeMemberAccess(
          System.Linq.Expressions.Expression.Parameter(typeof(TEntity), "te"), 
          typeof(TEntity).GetProperty(_filterProperty)), 

       System.Linq.Expressions.Expression.Constant(FilterValue)), 
        System.Linq.Expressions.Expression.Parameter(typeof(TEntity), "te")); 

      return query.Where(additionalExpression); 
     } 

표현 나무는 홍보입니다 강력한 힘이