2011-06-29 8 views
1

私は、RejectedRecordの施設がユーザーが割り当てられている施設のリストにあるか、または削除されているとフラグが付けられていないuseruploadedによって "RejectedRecords"を取得する基準クエリを作成しようとしています。 (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))(単純化のための擬似コード)のように書かなければならない....だと思う、それは間違っている足します。 Add(suquery.propertyin) – Jaguar

+0

@Jaguarあなたは正しく私はチェーンが間違っていた。私は今答えを編集し、構文とSQLの正しさをテストしました。 –

+0

の右上にあります。皆さんありがとう。 – dolphy