2014-02-18 135 views
3

我正在搜索一個sql server數據庫,顯然它比應用程序可以處理更多。我回到了很多結果的路上,我需要儘量減少發回的記錄數量,然後告訴用戶他們選擇了太多的記錄。需要linq查詢返回只有最後100個結果

以下是我有:

private List<Log> SearchLog() 
{ 
    try 
    {   
    using (var model = new SuburbanPortalEntities()) 
    { 
     var qry = from logs in model.Logs 
     where logs.LogDateTime > dateTimePicker_Start.Value && 
       logs.LogDateTime < dateTimePicker_End.Value 
     select logs; 

     Guid tokenid; 
     if (Guid.TryParse(textBox_TokenId.Text, out tokenid)) 
     { 
     qry = qry.Where(x => x.TokenId == tokenid); 
     } 

     if (!string.IsNullOrEmpty(textBox_SessionId.Text)) 
     { 
     qry = qry.Where(x => x.SessionId == textBox_SessionId.Text.ToLower()); 
     } 

     if (!string.IsNullOrWhiteSpace(textBox_Contains.Text)) 
     { 
     qry = qry.Where(x => x.Message.Contains(textBox_Contains.Text)); 
     } 

     if (checkedListBox_DisplayFilter.GetItemChecked(0)) 
     { 
     qry = qry.Where(x => x.IsWarning); 
     } 

     if (checkedListBox_DisplayFilter.GetItemChecked(1)) 
     { 
     qry = qry.Where(x => x.IsException); 
     } 

     var sourceEnumList = new List<string>(); 
     if (checkBox_WebPortal.Checked) 
     { 
     sourceEnumList.Add("WebPortal"); 
     } 

     if (checkBox_SubService.Checked) 
     { 
     sourceEnumList.Add("SubService"); 
     } 

     if (checkBox_TruckRouting.Checked) 
     { 
     sourceEnumList.Add("TruckRouting"); 
     } 

     if (checkBox_SuburbanHub.Checked) 
     { 
     sourceEnumList.Add("SuburbanHub"); 

     } 
     if (sourceEnumList.Any()) 
     { 
     qry = qry.Where(x => sourceEnumList.Contains(x.SourceEnum)); 
     } 

     qry = qry.OrderByDescending(x => x.LogDateTime); 

     return qry.ToList(); 
    } 

    } 
    catch (Exception ex) 
    { 
    MessageBox.Show("Error: " + ex.Message); 
    return null; 
    } 
} 

如何獲得最後100條記錄,知道告訴他們需要優化其搜索用戶?

謝謝!

+0

做到這一點,最好的辦法是通過反轉排序順序拿到前100名。 –

回答

9

您可以使用Take方法

return qry.Take(100).ToList(); 

如果不通過降序排列這會給你的第一個100 records.But我看你已經做了排序您記錄進行排序,所以這應該給你正確的result.Anyway,如果你想在這裏刪除OrderBy是一個行版本,以避免混淆:

return qry.OrderByDescending(x => x.LogDateTime).Take(100).ToList(); 
+0

這會給我最後100個記錄嗎?另外,我怎麼知道他們選擇了太多? – ErocM

+0

是的,那會給出最後100條記錄。如果你想使用用戶選擇的行數,那麼你可以使用一個參數,獲取用戶選擇並通過該參數採取方法。 –

+0

啊等待我正在推翻它,我可以看到如果你的幫助記錄的數量是100 tyvm! – ErocM

2

只要改變順序和採取的第一個100人。

qry = qry.OrderBy(x => x.LogDateTime).Take(100).OrderByDescending(x => x.LogDateTime).ToList(); 

UPDATE:

我相信有引起的問題是如何措辭有些混亂。你真正尋找的是:qry.Take(100).ToList();(不要更改排序順序)

+1 @ Selman22

+0

謝謝你,這是我所需要的 – ErocM

+0

很高興我能幫到你。 –

+0

這將永遠不會給最後100條記錄。這將採取前100條記錄,然後按降序排序。 –

0

使用

.Take() 

要限制返回的行數。這與

.Skip() 

允許您分頁您的結果。

在使用之前跳過並取出我強烈建議您使用.Order()命令來確保您按所需順序獲取記錄。

如果你想知道,如果有100多個記錄。取使用(101),看看你回來100多條記錄

int page = 0; 
int pageSize = 100 
var result = dataset.OrderBy(x=> x.somecolumn).Skip(page * 100).Take(pageSize + 1); 

if(result.Count()>pageSize + 1) 
    // there are more records than we can display