以下是代码段
IEnumerable<Car> GetCars()
{
foreach(var request in RequestQueue())
{
RemoveFromQueue(request);
yield return MakeCar(request);//Expensive
}
}
//使用场景1:没问题
foreach(Car c in GetCars())
{
//Do stuff
}
//使用情景2:问题,我已经构建了所有汽车,但只想要1。
foreach(Car c in GetCars().Where(p=>p.Request.Id==10000))
{
//Do stuff
}
在我开始制作汽车之前,是否可以实施评估Where子句?怎么样?
显然,where子句可能因客户端使用情况而异。
动机:当您执行Linq to SQL时,.Take(10)将转换为Top(10)并在服务器上执行查询。我希望实现这样的目标。
答案 0 :(得分:1)
@J.13.L的建议可能是最实用的建议:公开一个获得一辆汽车的API。
也就是说,关于.Take(10)如何在SQL服务器上转到TOP 10的最后一个问题的答案是你必须实现一个IQueryable提供程序并解析表达式树。这不是一件轻而易举的事,但如果你有兴趣学习如何,那么这里有很多关于这样做的文章:
答案 1 :(得分:0)
不确定没有看到你的其余代码,但是什么阻止你这样做?
Car GetCar(id)
{
Car result = default(Car);
// I am assuming that RequestQueue() is Enumerable?
Request request = RequestQueue().SingleOrDefault(p => p.Request.Id == id);
if(result != null)
{
RemoveFromQueue(request);
result = MakeCare(request);
}
return result;
}
然后使用此方法代替GetCar()和// Do Something,但很难知道如果没有看到更多代码,这是否可行。希望这会有所帮助...