2011-06-29 81 views
1

我試圖創建一個標準查詢,通過useruploaded抓取「RejectedRecords」,但不會被標記爲被刪除,或者RejectedRecord中的Facility位於用戶分配給設施的列表中(user.UserFacilities)。我有第一部分工作正常(按用戶和未刪除),但我不知道如何添加OR子句來記錄用戶設施集合中的記錄。在SQL它會是什麼樣子:NHibernate Criteria API幫助需要請

SELECT * 

FROM RejectedRecords 

WHERE (UserUploaded = 1 AND IsDeleted = 0) 
OR FacilityId IN (SELECT FacilityId FROM UserFacility WHERE UserId = 1) 

這是我在C#中嘗試(不知道如何執行的子查詢):

public IList<RejectedRecord> GetRejectedRecordsByUser(User u) 
    { 
     return base._session.CreateCriteria(typeof(RejectedRecord)) 
      .Add(
        (
         Expression.Eq(RejectedRecord.MappingNames.UserUploaded, u) 
         && Expression.Eq(RejectedRecord.MappingNames.IsDeleted, false) 

        ) 
      ) 
      .List<RejectedRecord>(); 
    } 

回答

3

的關鍵是使用Disjunction and Conjunction使用子查詢相結合。

var facilityIdQuery = DetachedCriteria.For<UserFacility>() 
    .Add(Expression.Eq("User.Id", u)) 
    .SetProjection(Projections.Property("Facility.Id")); 

var results = session.CreateCriteria<RejectedRecords>() 
    .Add(
     Restrictions.Disjunction() 
     .Add(
      Restrictions.And(
       Restrictions.Eq(RejectedRecord.MappingNames.UserUploaded, u), 
       Restrictions.Eq(RejectedRecord.MappingNames.IsDeleted, false) 
      ) 
     ) 
     .Add(Subqueries.PropertyIn("FacilityId",facilityIdQuery)) 
    ).List(); 
+0

的概念是正確的,但你書面方式是錯誤的,我認爲....應該寫爲(僞代碼爲簡單起見)Disjunction.Add(Expression.And(Eq.useruploaded,Eq.isdeleted))。添加(suquery.propertyin) – Jaguar

+0

@Jaguar你是對的,我的鏈條錯了。我現在編輯了答案並測試了正確性的語法和SQL。 –

+0

對。謝謝大家。 – dolphy