2009-11-25 3 views
1

다음을 시도하면 오류가 발생합니다. 프로젝션없이 조건에 서브 쿼리를 사용할 수 없습니다.사용자 정의 Linq 컴파일 타임에 속성 이름을 알 수없는 쿼리

누구나 IQueryable : repository.Query (클래스 수준에서 정의 됨)에 대한 속성 이름을 사용하여 추가 된 표현식을 어떻게 만들 수 있는지 알려 줄 수 있습니까?

private void CheckConstraints(T model, ModelStateDictionary modelState) 
      { 
       foreach (var property in typeof(T).GetProperties()) 
       { 
        if (property.HasCustomAttribute<UniqueInDatabase>()) 
        { 
         object value = property.GetValue(model, null); 
         var count = 
          repository.Query<T>().Where(x => x.GetType().GetProperty(property.Name) == value).Count(); 

         if ((model.Id > -1 && count > 1) || (model.Id == -1 && count > 0)) 
          modelState.AddModelError("Not unique", string.Format("{0} already exists in database", property.Name.CapitalizeSpace())); 

        } 
       } 

      } 

확인 도움이되었으므로 원본 코드에서 오류를 발견하고 해결책을 찾았습니다. 이것이 NHibernate에 저장소를되었을 때 다음 코드는 잘 작동 :

private void CheckConstraints(T model, ModelStateDictionary modelState) 
     { 
      foreach (var property in typeof(T).GetProperties()) 
      { 
       if (property.HasCustomAttribute<UniqueInDatabase>()) 
       { 
        object value = property.GetValue(model, null); 
        var count = repository.GetSession().CreateCriteria<T>() 
         .Add(Expression.Eq(property.Name, value)) 
         .Add(Expression.Not(Expression.Eq("Id", model.Id))) 
         .List().Count; 

        if (count > 0) 
         modelState.AddModelError("Not unique", string.Format("{0} already exists in database", property.Name.CapitalizeSpace())); 

       } 
      } 

     } 
+0

"value"에는 .GetProperty (string)이 PropertyInfo를 반환하는 동안 해당 속성에 저장된 값이 포함되어있을 가능성이 있습니다. 내가 본 것으로부터 where 절은 항상 빈 세트를 리턴합니다. – flq

답변

2

당신은이에 대한 Dynamic LINQ을 시도 할 수도 있습니다. 동적 LINQ 코드는 VS2008 Code Samples의 일부로 사용할 수 있습니다.

using System.Linq.Dynamic; 

... 

var count = repository.Query<T>() 
         .Where("@0 == @1", property.Name, value) 
         .Count(); 
+1

좋은 생각, 정말이 내 문제를 해결할 것이라고 생각하지만 이제 null 조회 예외가 throw되는 얻을 : [NullReferenceException : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.] NHibernate.Criterion.SubqueryExpression..ctor (String op , String quantifier, DetachedCriteria dc) – Richard

+0

Dynamic LINQ 코드가 어떤 형태로든 nHibernate와 함께 작동하는지는 알지 못합니다. 나는이 시점에서 LINQ에서 nHibernate까지 완벽하게 다루지는 않는다는 것을 알고있다. 질문에 nHibernate 정보를 추가하고 다시 질문 할 수 있습니다. 아마도 nHibernate에서 직접이 작업을 수행 할 수있는 방법이있을 것입니다. – tvanfosson

+0

OK를 클릭하겠습니다. 그러나 솔루션에 대한 답변을 주셔서 감사합니다. – Richard

관련 문제