c# - 如何使用方法语法重写这一行?

标签 c# linq

我正在使用 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' 不包含 'Where' 的定义,并且找不到接受类型为 'UserCollection' 的第一个参数的扩展方法 'Where'(您是否缺少 using 指令或汇编引用?)

但据我所知,这两种说法是相同的。

为什么会这样?

最佳答案

不,它们非常轻微不同。因为你在这里有一个显式类型的范围变量:

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> - 这就是您需要 Actor 阵容的原因。

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

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

关于c# - 如何使用方法语法重写这一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32931276/

相关文章:

c# - 返回加入 Linq C#

c# - 如何在单元测试中将 FakeItEasy 与 HttpClient 一起使用?

c# - 如何掌握所有C#函数特性?

c# - 使用 linq 查询 xmlnode

c# - 如何使用linq从xml中获取具有相同名称的不同值

c# - 简单的 LINQ 搜索查询,添加附加参数

c# - HTML Agility Pack (C#) 使我的代码变形

c# - 将 double 值转换为二进制值

c# - 通过反射调用 this[int index]

c# - 如何将 IEnumerable<T> 添加到现有的 ICollection<T>