2014-10-02 26 views
1

這是我想解決的問題,我想要得到nhibernate linq查詢,這將允許我能夠做到這一點。所以我有一個表稱爲組織具有名稱和id.Say這具有10nhibernate尋呼查詢獲得下一組結果


  1. ID = 1個名稱= 「d」
  2. ID = 2名稱= 「B」
  3. ID = 3名= 「C」
  4. ID = 4名= 「E」
  5. ID = 5名= 「F」
  6. ID = 6名= 「G」
  7. ID = 7名=」 h「
  8. ID = 8名= 「我」
  9. ID = 9名= 「J」
  10. ID = 10名= 「K」

我想要做的組織的尋呼如下。

第一次使用我通過在索引0和的pageSize = 2和的OrderBy = 「名稱」因此這將返回機構單位有** [ID = 2,名稱= B]和[ID = 3名= C ]這很簡單。 現在第二次我想要得到下一組2是在字母表中的第二個元素之後的組織,所以在這種情況下我期望得到org id = 1和id = 4,所以我通過索引= 1,pagesize = 2以及LastElementId = 3。你能幫助我的查詢,這將使我id = 1和4的組織。出於性能的原因,我想阻止必須獲得所有10個元素和做foreach等這些。

回答

1

不知道index變量是什麼,但是好像你正在尋找的SQL,看起來像這樣:

select 
    top (2) * 
from  
    [MyEntity] 
order by 
    [MyEntity].[Name] asc 

(對於第一個查詢)

以及對於後續查詢:

select 
    top (2) * 
from  
    [MyEntity] 
where 
    [MyEntity].[Name] > (
     select [LastEntity].[Name] 
     from [MyEntity] as [LastEntity] 
     where [LastEntity].[Id] = 3 --LastElementId 
    ) 
order by 
    [MyEntity].[Name] asc 

隨着QueryOver,這可能是這樣寫的:

public IList<MyEntity> PerformQuery(
    ISession session, 
    int pageSize, 
    int? lastElementId) 
{ 
    var query = session.QueryOver<MyEntity>(); 

    if (lastElementId.HasValue) 
    { 
     query.Where(
      Restrictions.GtProperty(
       Projections.Property<MyEntity>(e => e.Name), 
       Projections.SubQuery(
        QueryOver.Of<MyEntity>() 
         .Where(le => le.Id == lastElementId.Value) 
         .Select(le => le.Name)))); 

    } 

    return query.OrderBy(e => e.Name).Asc 
     .Take(pageSize)  
     .List<MyEntity>(); 
} 
+0

謝謝安德魯,這正是我一直在尋找的。 – Somedeveloper 2014-10-03 09:03:00

1

它應該大致像這樣工作:

int index = 0; 
int pageSize = 2; 
session.Query<ModelClass>().OrderBy(m => m.Name).Skip(index * pageSize).Take(pageSize); 
+0

感謝您的回覆德克和作品,但它在這裏我想確保我選擇組織名稱後的下一個2元的部分=」 C」。有可能自第一個查詢後插入了其他組織,因此跳過不會真的將其切割掉 – Somedeveloper 2014-10-02 12:13:06

+0

如果您擔心其他元素被添加到列表中,則需要對所有元素運行查詢並將它們在某處緩存中,並針對緩存版本運行相同的查詢,而不是實時數據庫。 – Fran 2014-10-02 18:17:33