2009-11-25 73 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

不知道你的錯誤,但「價值」可能包含存儲在上述財產而.GetProperty(串)應該返回你的PropertyInfo值。從我看到的,你的where子句總是會返回一個空集。 – flq 2009-11-25 13:25:41

回答

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引用異常被拋出:[NullReferenceException:對象引用未設置爲對象的實例。] NHibernate.Criterion.SubqueryExpression..ctor(String op ,字符串量化器,DetachedCriteria dc) – Richard 2009-11-25 14:37:02

+0

我不知道動態LINQ代碼是否以任何形式與nHibernate協同工作,儘管我懷疑有些東西可能會起作用。我知道LINQ-to-nHibernate在這個時候還沒有完全的功能。您可能需要將nHibernate信息添加到您的問題並重新提問。也許有一種方法可以直接在nHibernate中執行此操作。 – tvanfosson 2009-11-25 14:48:15

+0

確定會做,但謝謝你的答案將接受無論如何,因爲你的解決方案是正確的。 – Richard 2009-11-25 14:49:43