C# 如果不是第一页,则跳过Linq

C# 如果不是第一页,则跳过Linq,c#,linq,C#,Linq,如果存在条件,我只想将skip()应用于IQueryable meetings = await _meetingRepository.GetAll() .WhereIf(!input.IncludeCanceledMeetings,m=>!m.IsCancelled) .OrderBy(input.OrderBy+" " + input.Sort) .SkipIf(input.CurrentPage!=1,input.

如果存在条件,我只想将skip()应用于IQueryable

    meetings = await _meetingRepository.GetAll()
                .WhereIf(!input.IncludeCanceledMeetings,m=>!m.IsCancelled)
                .OrderBy(input.OrderBy+" " + input.Sort)
.SkipIf(input.CurrentPage!=1,input.PageSize*input.CurrentPage-1)
                .Take(input.PageSize)
                .ToListAsync();
有一个肮脏的解决办法

    if (currentPage!=1){
       query=query.skip(PageSize*currentPage-1)
   }
    meetings = await _meetingRepository.GetAll()
                .WhereIf(!input.IncludeCanceledMeetings,m=>!m.IsCancelled)
                .OrderBy(input.OrderBy+" " + input.Sort)
.SkipIf(input.CurrentPage!=1,input.PageSize*input.CurrentPage-1)
                .Take(input.PageSize)
                .ToListAsync();
但我不认为这是一个好的和优雅的代码,我需要像linq whereIf扩展这样的东西

    meetings = await _meetingRepository.GetAll()
                .WhereIf(!input.IncludeCanceledMeetings,m=>!m.IsCancelled)
                .OrderBy(input.OrderBy+" " + input.Sort)
.SkipIf(input.CurrentPage!=1,input.PageSize*input.CurrentPage-1)
                .Take(input.PageSize)
                .ToListAsync();
如果存在条件,如何跳过? 我以错误的方式应用skip方法

    meetings = await _meetingRepository.GetAll()
                .WhereIf(!input.IncludeCanceledMeetings,m=>!m.IsCancelled)
                .OrderBy(input.OrderBy+" " + input.Sort)
.SkipIf(input.CurrentPage!=1,input.PageSize*input.CurrentPage-1)
                .Take(input.PageSize)
                .ToListAsync();
问题是如果currentPage为1,则它不应跳过pageSize记录的前n个数字。所以我需要和if一起检查情况

    meetings = await _meetingRepository.GetAll()
                .WhereIf(!input.IncludeCanceledMeetings,m=>!m.IsCancelled)
                .OrderBy(input.OrderBy+" " + input.Sort)
.SkipIf(input.CurrentPage!=1,input.PageSize*input.CurrentPage-1)
                .Take(input.PageSize)
                .ToListAsync();
//优雅的方式应该是这样的

    meetings = await _meetingRepository.GetAll()
                .WhereIf(!input.IncludeCanceledMeetings,m=>!m.IsCancelled)
                .OrderBy(input.OrderBy+" " + input.Sort)
.SkipIf(input.CurrentPage!=1,input.PageSize*input.CurrentPage-1)
                .Take(input.PageSize)
                .ToListAsync();

谢谢

如果(currentPage!=1)您甚至不需要条件
。您只需将其写成
query=query.skip(PageSize*(currentPage-1))
。让我们用常量替换变量,看看这是什么样子

    meetings = await _meetingRepository.GetAll()
                .WhereIf(!input.IncludeCanceledMeetings,m=>!m.IsCancelled)
                .OrderBy(input.OrderBy+" " + input.Sort)
.SkipIf(input.CurrentPage!=1,input.PageSize*input.CurrentPage-1)
                .Take(input.PageSize)
                .ToListAsync();
query=query.skip(10*(1-1)) // PageSize = 10, currentPage = 1
注意括号(记住高中代数中的运算顺序)。1-1 = 0. 任何乘以零的值都是零,因此第1页的结果代码如下所示:

    meetings = await _meetingRepository.GetAll()
                .WhereIf(!input.IncludeCanceledMeetings,m=>!m.IsCancelled)
                .OrderBy(input.OrderBy+" " + input.Sort)
.SkipIf(input.CurrentPage!=1,input.PageSize*input.CurrentPage-1)
                .Take(input.PageSize)
                .ToListAsync();
query=query.skip(0);
query=query.skip(10*(2-1)) // == query=query.skip(10*1) == query=query.skip(10)
基本上与以下内容相同:

    meetings = await _meetingRepository.GetAll()
                .WhereIf(!input.IncludeCanceledMeetings,m=>!m.IsCancelled)
                .OrderBy(input.OrderBy+" " + input.Sort)
.SkipIf(input.CurrentPage!=1,input.PageSize*input.CurrentPage-1)
                .Take(input.PageSize)
                .ToListAsync();
query=query;
如果
currentPage
是2而不是1,那么它将如下所示:

    meetings = await _meetingRepository.GetAll()
                .WhereIf(!input.IncludeCanceledMeetings,m=>!m.IsCancelled)
                .OrderBy(input.OrderBy+" " + input.Sort)
.SkipIf(input.CurrentPage!=1,input.PageSize*input.CurrentPage-1)
                .Take(input.PageSize)
                .ToListAsync();
query=query.skip(0);
query=query.skip(10*(2-1)) // == query=query.skip(10*1) == query=query.skip(10)

你的代码看起来不错。如果需要,可以将其提取到方法(或扩展方法)中以提高可读性。为什么您认为您的代码不美观?类似的方法可能会起作用:query.Select((x,index)=>new{x=x,index=index})//elegent way meetings=Wait _meetingRepository.GetAll()。其中(!input.IncludeCanceledMeetings,m=>!m.IsCancelled)。OrderBy(input.OrderBy+“”+input.Sort)。SkipIf(input.CurrentPage!=1,input.PageSize*input.CurrentPage-1).Take(input.PageSize).toListSync();您的答案是正确的,我以前测试过,但问题是我将0作为第一页发送。那是米斯凯特。我应该把第一页设为1。谢谢。如果答案对你有帮助的话,别忘了做标记。