我有这个项目,我需要做的任务之一就是找到特定对象出现在哪个页面上。该对象具有预定义的ID,ID的显示顺序为0到N,但它们可能会跳过值。
显然,这意味着使用我正在寻找的元素的ID将不起作用,就好像它是25,并且每页应该有10个项目,但是其中8个项目丢失了,它会尝试适合第3页,但只适合第2页。
这就是我现在所拥有的,我想知道是否有更好的方法:
int itemsPerPage = Convert.ToInt32(masterDbContext.Settings.First(x => x.Name == "ItemsPerPage").Value);
int itemCount = masterDbContext.Items.OrderBy(x => x.Id).TakeWhile(x => x.Id < currentItemId).Count();
int pageNumber = (int)Math.Ceiling((double)itemCount / itemsPerPage);
Response.Redirect("~/View/" + rootItem.Id + (pageNumber > 1 ? "/Page/" + pageNumber : ""));
如果没有更好的方法可以做到这一点,那很好。我只是希望存在,因为我确信TakeWhile
可以在数据库中有数千个Items
时花费一段时间。
请注意:此方法目前似乎有效。
答案 0 :(得分:4)
你几乎拥有它。由于您按ID排序项目并计算ID小于数字的项目数量,因此您可以在Count
中使用该条件:
var itemsPerPage = Convert.ToInt32(masterDbContext.Settings.First(x => x.Name == "ItemsPerPage").Value);
var itemCount = masterDbContext.Items.Count(x => x.Id < currentItemId);
TakeWhile
LINQ扩展方法也没有直接的SQL匹配。因此,当您希望将LINQ查询转换为SQL
答案 1 :(得分:2)
假设它使用某种形式的SQL提供程序,您只需要在SQL中执行此操作:
SELECT COUNT([Id])
FROM [Items]
WHERE [Id] < @currentItemId
C#LINQ:
masterDbContext.Items.Count(item => item.Id < currentItemId);
答案 2 :(得分:-3)
尝试类似
的内容int itemCount = masterDbContext.Items.FindIndex(x => (x.Id == given_ID));