2014-07-03 94 views
4
var result=(from refridgerators in context.A            
            group refridgerators by new { refridgerators.Id, refridgerators.Name } into gr 
            select new DAO<String> 
            { 
             Key = gr.Key.Name, 
             Count = gr.Count() 
            }).OrderByDescending(k => k.Count).Take(numberOfRecords).ToList(); 

這是我的LINQ到SQL查詢這工作完全正常。LINQ to SQL。如何選擇所有記錄使用。()

如果我通過numberOfRecords = 5,它會顯示前5條記錄(按其計數排序)。

現在我的問題是我不想修改查詢。所以我應該在上面的查詢中顯示所有記錄。這與我的要求有關,我希望使用相同的查詢來顯示所有的冰箱和前5名,前10名冰箱。

我不確定是否可以使用LINQ。但我想這肯定是有關係的。

回答

1

由於Tim已經發布了正確的解決方案,我希望將您的注意力放在更簡單的解決方案上,如果符合您的要求。 如果條件在此查詢的頂部,則再添加一個。

if(allRecordRequired) 
{ 
    numberOfRecords = 2000000; 
} 

讓您的查詢保持原樣。

+0

我會和這一起去的,因爲我的數字永遠不會超過這個限制,所以我認爲暫時適合我的條件 – iGod

1

傳遞一個巨大的數字給你的方法。一個等於(至少)或大於物品數量的數字。這應該給你所有的記錄。

+0

謝謝,有一件事我想問一下,所以這意味着在take()中沒有任何默認選擇所有記錄 – iGod

+0

@ user2010571是的,這就是爲什麼方法的名稱是Take not Select。 –

5

我只是不會將Take添加到查詢中,而是添加到您使用此查詢的代碼中。

因此,例如:

public static IEnumerable<DAO> GetRefrigerators() 
{ 
    var query = from refridgerators in context.A            
       group refridgerators by new { refridgerators.Id, refridgerators.Name } into gr 
       select new DAO<String> 
       { 
        Key = gr.Key.Name, 
        Count = gr.Count() 
       }; 
    return query.OrderByDescending(k => k.Count); 
} 

現在你可以使用:

var refrigerators = GetRefrigerators().Take(5).ToList(); 

var refrigerators = GetRefrigerators().Take(10).ToList(); 

var refrigerators = GetRefrigerators().ToList(); 
+0

謝謝,這是非常有幫助的。所以你的意思是說,我必須選擇所有的記錄,然後採取最後5,10。所以這將是表現超過頭。我跟着這個鏈接http://stackoverflow.com/questions/5345939/sql-table-paging-performance-is-ef4-linq-skip-take-equal-in-performance-th – iGod

+3

@ user2010571:沒有性能開銷因爲所有方法都使用延遲執行。查詢在最後的ToList中執行。所以'Take(10)'將被轉換爲sql並在數據庫中執行。請注意'GetRefrigerators()。ToList()'會將所有*記錄加載到'List '中,這會傷害你的記憶(將來)。 –

4

我會做一個numberOfRecords和int?如果該值爲空,你不應該叫Take(numberOfRecords)

var result = (from refridgerators in context.A 
       group refridgerators by new { refridgerators.Id, refridgerators.Name } into gr 
       select new DAO<String> 
       { 
       Key = gr.Key.Name, 
       Count = gr.Count() 
       }).OrderByDescending(k => k.Count); 

if(numberOfRecords.HasValue) 
    result = result.Take(numberOfRecords.Value); 

return result.ToList(); 

我知道它改變了你的查詢一點點,但我相信這是相當可以接受的,增加了numberOfRecords的一個超高的值增加了對你的查詢的竊聽,這在你的情況下是無用的。

+0

謝謝。這篇文章很有幫助。這與Tim Schmelter給出的答案很相似。並且我也使用了空值。 – iGod

+0

事實上,答案非常相似,儘管我個人不喜歡返回尚未執行的IEnumerable ,因爲當您的代碼很難確定執行的位置時變得更大。 – TopinFrassi

+0

我試過這個,並且OrderByDescending()返回一個與Take()不同的類型,這使得'result'不能被重新分配。 我在'OrderByDescending(k => k.Count)'後面加了'.TakeWhile(t => true)'' – Hypersapien

1

所以這個職位是很老了,我知道,但沒有提供我的解決方案(也許有人想在2年後達到同樣的,像我一樣):

你可以創建自己的擴展,方法也與linq 2 sql一起工作。例如:

public static class LinqExtensions 
{ 
    public static IEnumerable<TResult> TakeIfNotNull<TResult>(this IEnumerable<TResult> source, int? count) 
    { 
     return !count.HasValue ? source : source.Take(count.Value); 
    } 
} 

這需要的int?代替int並返回任一源極 - 枚舉如果countnull否則返回缺省Take -method的結果。

所以,你可以這樣寫:

.OrderByDescending(k => k.Count).TakeIfNotNull(numberOfRecords).ToList(); 

如果numberOfCounts爲null,它會採取所有記錄。