C# 迭代dbset以获得接下来的n行
我试图找出什么是一种好方法,可以通过各种函数调用不断迭代dbset,最后循环一次 基本上,我在数据库中有一堆广告,我想在dbset.Ads上获得下一个(计数) 这里有一个例子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。然后用户
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;
}