2012-05-02 15 views
1

私はアプリケーションとしてfirebirdをデータベースとしてnhibernateを使用しています。 現在membebershipプロバイダを行使しようとしているが、私は次のコードNHibernate.Driver.FirebirdClientDriverは複数のクエリをサポートしていません

#region Test FindUserByEmail 
     [Test] 
     public void FindUserByEmail() 
     { 
      //Arrange 
      var email = "[email protected]"; 
      var recs = -1; 
      var expectedRecords = 1; 

      //Act 
      var actual = _provider.FindUsersByEmail(email, 0, 99, out recs); 
      //Assert 
      Assert.AreEqual(expectedRecords, recs); 
      Assert.AreEqual(expectedRecords, actual.Count); 
     } 
     #endregion 

を持つ私の試験方法はNHibernateはFirebirdのドライバが複数のクエリを受け入れ、解決策があります、次のエラーメッセージ

The driver NHibernate.Driver.FirebirdClientDriver does not support multiple queries. 

を抱えていますか?

更新を使用すると、複数のRDBMSが、彼らは自動にフォールバックするので、私は代わりにMultiCriteriaの先物を使用することをお勧めサポートしている場合の両方がmultiqueriesに

をサポートしていません

public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) 
     { 
      CheckParameter(ref emailToMatch, false, false, false, 100, "emailToMatch"); 

      if (pageIndex < 0) 
      { 
       throw new ArgumentException("The pageIndex must be greater than or equal to zero.", "PageIndex"); 
      } 
      if (pageSize < 1) 
      { 
       throw new ArgumentException("The pageSize must be greater than zero.", "pageSize"); 
      } 

      long upperBound = (long)pageIndex * pageSize + pageSize - 1; 
      if (upperBound > Int32.MaxValue) 
      { 
       throw new ArgumentException("The combination of pageIndex and pageSize cannot exceed the maximum value of System.Int32.", "pageIndex and pageSize"); 
      } 

      totalRecords = 0; 
      MembershipUserCollection users = new MembershipUserCollection(); 
      IList results; 
      using (ISession session = SessionProvider.Instance.OpenSession()) 
      { 
       using (ITransaction tran = session.BeginTransaction()) 
       { 


        results = session.CreateMultiCriteria() 
             .Add(session.CreateCriteria(typeof(User)).Add(Restrictions.Like("UpperEmail", emailToMatch.ToUpper())).SetFirstResult(pageIndex * pageSize).SetMaxResults(pageSize)) 
             .Add(session.CreateCriteria(typeof(User)).Add(Restrictions.Like("UpperEmail", emailToMatch.ToUpper())).SetProjection(Projections.RowCountInt64())) 
             .List(); 
        tran.Commit(); 
       } 
      } 
      var dbUsers = (List<User>)results[0]; 
      totalRecords = (int)results[1]; 
      foreach (User u in dbUsers) 
      { 
       users.Add(new MembershipUser(Name, 
           u.UserName, 
           u.Id, 
           u.EMail, 
           u.PasswordQuestion, 
           u.Comment, 
           u.IsApproved, 
           u.IsLockedOut, 
           u.CreationDate, 
           GetNullableDateTime(u.LastLoginDate), 
           GetNullableDateTime(u.LastActivityDate), 
           GetNullableDateTime(u.LastPasswordChangeDate), 
           GetNullableDateTime(u.LastLockedOutDate))); 
      } 
      return users; 
+0

FindUsersByEmail()のコードを表示できますか? – Firo

+0

@Firoが追加されましたFindUsersByEmail() – Grunf

答えて

2

FirebirdClientDriverFirebirdDriverをFindUsersByEmailメソッドを追加しました複数クエリがサポートされていない場合の通常のクエリ

例:

var userquery = session.CreateCriteria(typeof(User)) 
    .Add(Restrictions.Like("UpperEmail", emailToMatch.ToUpper())) 
    .SetFirstResult(pageIndex * pageSize) 
    .SetMaxResults(pageSize); 

var totalcountQuery = CriteriaTransformer.Clone(userquery) 
    .SetProjection(Projections.RowCountInt64())); 

IEnumerable<User> dbUsers = userquery.Future<User>(); 

IFutureValue<long> count = totalcountQuery.FutureValue<long>(); 

totalcount = count.Value; // both will be executed here 
foreach (User u in dbUsers) 
関連する問題