我如何使用方法语法重写这一行
本文关键字:一行 重写 使用方法 语法 | 更新日期: 2023-09-27 18:15:49
我正在使用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?)
但在我看来,这两个陈述是相同的。
为什么会发生这种情况?
不,它们非常小的不同。因为这里有一个显式类型的范围变量:
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();