我正在嘗試創建一個LINQ提供程序。我正在使用指南LINQ: Building an IQueryable provider series,並且我已將代碼添加到LINQ:構建IQueryable提供程序 - 第IV部分。LINQ表達式如何知道Where()在Select()之前?
我感覺到它是如何工作的,以及它背後的想法。現在我被困在一個問題上,這不是一個代碼問題,而是更多關於理解的問題。
我發射了這一說法:
QueryProvider provider = new DbQueryProvider();
Query<Customer> customers = new Query<Customer>(provider);
int i = 3;
var newLinqCustomer = customers.Select(c => new { c.Id, c.Name}).Where(p => p.Id == 2 | p.Id == i).ToList();
莫名其妙的代碼,或表情,知道,Where
而來的Select
之前。但是如何以及在哪裏?
在調試模式下,對錶達式進行排序的代碼沒有辦法,實際上ToString()
顯示在Select之前出現在Where
之前。
我試圖讓代碼失敗。正常情況下,我先做了Where
,然後再做了Select
。
那麼表達式如何排序呢?我沒有對指南中的代碼進行任何更改。
你是什麼意思「選擇前的位置」?你的意思是在生成的SQL? – svick
我能想到的唯一的事情是,也許你看到生成的SQL有SELECT和WHERE重新排序?在這種情況下,我猜想在Linq2Sql提供程序中有一個優化步驟,它需要'SELECT Id,Name FROM(SELECT Id,Name FROM Customer WHERE Id = 2 || Id = @ i)'並將其轉換爲'SELECT Id,姓名從客戶那裏Id = 2 || Id = @ i' - 但這是你所看到的,這是你問什麼? – Stuart
你知道[re-linq](http://relinq.codeplex.com/),對吧?你不是在重新發明輪子,我希望:-) – xanatos