2010-10-16 26 views
0

假設如下代碼:爲什麼跳過並採取通過一種方法時不起作用?

IEnumerable<MyClass> MakeQuery() 
{ 
    var query = from m in session.Linq<MyClass>() 
       select m; 
    return query; 
} 

List<MyClass> m1() 
{ 
    return MakeQuery() 
    .Skip(10) 
    .Take(20) 
    .ToList<MyClass>(); 
} 

List<MyClass> m2() 
{ 
    var query = from m in session.Linq<MyClass>() 
       select m; 

    return query 
    .Skip(10) 
    .Take(20) 
    .ToList<MyClass>(); 
} 

假設所有查詢都一樣,似乎在m1()SkipTake不起作用。事實上,它們並不存在。

爲什麼會發生這種情況,如何解決?

我正在使用linq-to-nhibernate,並且此方法用於分頁。謝謝。

+0

對不起ChrisF,我錯過了一些代碼之間的唯一區別,但它完成。 – 2010-10-16 17:54:21

+0

您是否在兩種情況下都檢查過查詢是否返回相同的數據?我知道它應該(來自你發佈的代碼),但是檢查這些東西以消除它可能是一個可能的原因。 – ChrisF 2010-10-16 17:55:21

+0

@ChrisF,你爲什麼認爲他們有不同的結果?它們在'MakeQuery()'和'm2'中都是相同的查詢。我從同一位置複製粘貼它們。 – 2010-10-16 18:31:27

回答

2

爲什麼不爲MakeQuery()方法使用IQueryable?

IQueryable<MyClass> MakeQuery() 
{ 
    return session.Linq<MyClass>(); 
} 

不是說實際的查詢很有意義。但我會把它留給你。

但是,這也是M1()和M2()

+0

它神奇地工作!但怎麼可能? 'IEnumerable'和'IQueryable'有什麼區別? – 2010-10-16 19:43:00

+1

IEnumerable在內存中處理,因爲IQueryable用於在執行之前構建查詢。我無法準確地說出爲什麼它的行爲不同,但它必須與具體的數據結構相關。通常這兩種解決方案都可行。但考慮到使用IQueryable也是最高性能的解決方案,我會堅持下去。 – 2010-10-17 22:51:11

相關問題