如何重新评估此Linq场景的评估

时间:2009-05-20 02:52:17

标签: c# linq

以下是代码段

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)并在服务器上执行查询。我希望实现这样的目标。

2 个答案:

答案 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,但很难知道如果没有看到更多代码,这是否可行。希望这会有所帮助...