我正在使用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>-这就是为什么需要强制转换。

您可以通过隐式键入range变量来引发查询表达式相同的错误:

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

10-05 23:35