2009-05-20 35 views
0

这里的评价是一个代码段如何重新订购此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 
} 

在我开始制作Car之前,是否可以实施评估Where条款?怎么样?

显然,where子句可以根据客户端使用情况而有所不同。

动机:当您将Linq转换为SQL时,.Take(10)转换为Top(10)并在服务器上执行查询。我想要实现这样的事情。

回答

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()和//做一些事情,但很难知道这是否会没有看到更多的代码的工作。希望这有助于...

+0

增加了一个动机查询,看是否能帮助 – 2009-05-20 03:30:44

1

@J.13.L的建议可能是最好的实践之一:揭露一个获得单一汽车的API。

这就是说,最终问题的答案是关于如何.Take(10)在SQL服务器上进入TOP 10的原因是您必须实现IQueryable提供程序并解析表达式树。这是不是很琐碎,但如果你有兴趣学习如何,有一个很大的一系列关于在这里做的文章: