需要 Linq 查询仅返回最近的 100 条结果。

3
我正在查询一个SQL Server数据库,但似乎返回的结果比应用程序处理能力强。我收到了过多的结果,需要尽量减少返回记录数量,然后告诉用户他们选择了太多的数据。
以下是我目前所拥有的:
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条记录并告诉用户需要缩小搜索范围?

谢谢!


最好的方法是反转排序顺序并取前100个。 - Jeroen Landheer
3个回答

9
您可以使用Take方法。该方法的详细信息请参见此处
return qry.Take(100).ToList();

如果您不按降序对记录进行排序,这将为您提供前100条记录。但我看到您已经进行了排序,所以这应该会给您正确的结果。无论如何,如果您想删除OrderBy,这是避免混淆的一行版本:
return qry.OrderByDescending(x => x.LogDateTime).Take(100).ToList();

那会给我最后的100条记录吗?另外,我如何知道他们选择了太多? - ErocM
是的,那将会给出最后100条记录。如果您想使用用户选择的行数,那么可以使用一个参数,获取用户选择并将该参数传递给take方法。 - Selman Genç
1
@DanPuzey 在 return 语句前使用了 OrderByDescending,这就是为什么它会返回最后100条记录的原因。 - Selman Genç
如果您查看ErocM的代码,他在返回查询结果之前按降序排序... - jsmith
1
@Selman22 我理解你的困惑。你应该在你的回答中澄清他已经正确地进行了排序。 ;) - jsmith
显示剩余4条评论

2

只需要改变排序并取前100个。

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

更新:

我认为问题的措辞可能引起了一些混淆。你真正需要的是:qry.Take(100).ToList();(不要改变排序顺序)

+1 @Selman22


这个程序不会返回最后100条记录。它会首先获取前100条记录,然后按降序排列。 - Selman Genç

0

使用

.Take()

为限制返回的行数。这与...一起使用。
.Skip()

允许您对结果进行分页。

在使用Skip和Take之前,我强烈建议您使用.Order()命令来确保按照您想要的顺序获取记录。

如果您想知道是否有100多条记录,请使用.Take(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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接