2015-10-04 23 views
3

我與SMO的工作,我有這行代碼:如何使用方法語法重寫此行?

var results = (from User user in database.Users 
    where user.LoginType == LoginType.WindowsUser 
    select new { user.Name, user.Login }).ToList(); 

但不管是什麼原因,我不能寫這樣的查詢:

var results = database.Users 
       .Where(user => user.LoginType == LoginType.WindowsUser) 
       .Select(user => new { Name = user.Name, Login = user.Login }) 
       .ToList(); 

我得到的錯誤是'UserCollection' does not contain a definition for 'Where' and no extension method 'Where' accepting a first argument of type 'UserCollection' could be found (are you missing a using directive or an assembly reference?)

但據我所知,這兩個陳述是相同的。

爲什麼會發生這種情況?

+5

你有'使用System.Linq的:

您可以通過留下的範圍變量隱式類型挑起與查詢表達式同樣的錯誤? 「Where」和「Select」是擴展方法。 –

+0

@BrianRogers:這仍然會失敗,查詢表達式也是如此 - 編寫查詢表達式不會隱式地導入任何名稱空間。 –

+0

是的。它不會讓我使用查詢語法,否則。我得到錯誤'無法找到源類型'UserCollection'的查詢模式的實現。 'Cast'未找到。您是否缺少對'System.Core.dll'的引用或'System.Linq'的使用指令?' – Jake

回答

8

不,他們是很有點不同。因爲你必須有一個明確的類型的範圍變量在這裏:

from User user in database.Users 

您的查詢等效於:

var results = database.Users 
         .Cast<User>(); 
         .Where(user => user.LoginType == LoginType.WindowsUser) 
         .Select(user => new { user.Name, user.Login }) 
         .ToList(); 

想必你UserCollection類型實現IEnumerable,但不IEnumerable<User> - 這就是爲什麼你需要的投。 ;`你的文件的頂部

// This will fail 
var results = (from user in database.Users 
       where user.LoginType == LoginType.WindowsUser 
       select new { user.Name, user.Login }).ToList();