计算在具有特定ID

时间:2015-10-02 13:51:04

标签: c# .net entity-framework linq entity-framework-6

我有这个项目,我需要做的任务之一就是找到特定对象出现在哪个页面上。该对象具有预定义的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时花费一段时间。

请注意:此方法目前似乎有效。

3 个答案:

答案 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));