Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 迭代dbset以获得接下来的n行_C#_Asp.net Mvc_Linq_Entity Framework - Fatal编程技术网

C# 迭代dbset以获得接下来的n行

C# 迭代dbset以获得接下来的n行,c#,asp.net-mvc,linq,entity-framework,C#,Asp.net Mvc,Linq,Entity Framework,我试图找出什么是一种好方法,可以通过各种函数调用不断迭代dbset,最后循环一次 基本上,我在数据库中有一堆广告,我想在dbset.Ads上获得下一个(计数) 这里有一个例子 ID Text Other Columns... 1 Ad1 ... 2 Ad2 ... 3 Ad3 ... 4 Ad4 ... 5 Ad5 ... 6 Ad6 ... 假设在我看来,我需要2个广告来为用户1显示。我想退回广告1-2。然后用户

我试图找出什么是一种好方法,可以通过各种函数调用不断迭代dbset,最后循环一次

基本上,我在数据库中有一堆广告,我想在dbset.Ads上获得下一个(计数)

这里有一个例子

ID   Text   Other Columns...
1    Ad1    ...
2    Ad2    ...
3    Ad3    ...
4    Ad4    ...
5    Ad5    ...
6    Ad6    ...
假设在我看来,我需要2个广告来为用户1显示。我想退回广告1-2。然后用户2请求3个广告。我希望它返回3-5个。用户3需要2个广告,函数应该返回广告6和1,循环回到开始

这是我一直在使用的代码(它位于
classadsmanager
):


SkipWhile
在EF中不受支持;无法将其转换为SQL代码。EF基本上是在集合上工作,而不是在序列上(我希望这个句子有意义)

解决方法是在处简单使用
,例如:

IEnumerable<Ad> Ads = db.Ads.OrderBy(x=>x.Id).Where(x=>x.Id >= NextAd.Id);
IEnumerable Ads=db.Ads.OrderBy(x=>x.Id)。其中(x=>x.Id>=NextAd.Id);

也许您可以将其简化为以下内容:

Ad NextAd = db.Ads.First();

public IQueryable<Ad> getAds(count)
{
    var firstTake = db.Ads
        .OrderBy(x => x.Id)
        .Where(x => x.Id >= NextAd.Id);

    var secondTake = db.Ads
        .OrderBy(x => x.Id)
        .Take(count - result.Count());

    var result = firstTake.Concat(secondTake);

    NextAd = result.LastOrDefault()

    return result;
}
Ad NextAd=db.Ads.First();
公共IQueryable getAds(计数)
{
var firstTake=db.Ads
.OrderBy(x=>x.Id)
其中(x=>x.Id>=NextAd.Id);
var secondTake=db.Ads
.OrderBy(x=>x.Id)
.Take(count-result.count());
var结果=firstTake.Concat(secondTake);
NextAd=result.LastOrDefault()
返回结果;
}

抱歉,尚未测试此功能,但它应该可以工作。

我很欣赏它的简单性。因此,为了合并
count
,我只使用
Take()
,就像我在
if
语句中所做的那样
IEnumerable<Ad> Ads = db.Ads.OrderBy(x=>x.Id).Where(x=>x.Id >= NextAd.Id);
Ad NextAd = db.Ads.First();

public IQueryable<Ad> getAds(count)
{
    var firstTake = db.Ads
        .OrderBy(x => x.Id)
        .Where(x => x.Id >= NextAd.Id);

    var secondTake = db.Ads
        .OrderBy(x => x.Id)
        .Take(count - result.Count());

    var result = firstTake.Concat(secondTake);

    NextAd = result.LastOrDefault()

    return result;
}