linq的foreach结果不起作用

Sha*_*man 5 linq list

不知道这里有什么问题,当我运行应用程序时,在foreach循环中指向"查询中的var结果"时说"指定的方法不受支持".请帮忙...

var query = from c in entities.Customer
            select c.CustomerName;

List<string> customerNames = new List<string>();

foreach (var result in query)
{
    customerNames.Add(result.ToString());  
}
Run Code Online (Sandbox Code Playgroud)

编辑:使用ToList()也会给出相同的错误.

Car*_*nke 5

您的错误的原因是范围,这是"不支持的方法"错误告诉您的.

当使用Linq [填空] ORM时,通常会发生这种情况.所以,我猜你的实体必须来自ORM工具,比如Entity Framework,你正在使用像Linq to Entities这样的东西.

使用linq时,在访问它之前不会枚举您的查询,对于ORM来说,这意味着命中数据库或其他数据存储库.如果您不知道它存在,这种延迟动作可能会导致一些奇怪的行为,例如此错误.

但是,您有本地(非linq)代码并且您的查询交织在一起,因此linq to []编译器在编译linq代码时不知道如何处理本地代码.因此,"不支持的方法"错误 - 它基本上与从类外部引用私有方法相同,您调用的方法在当前范围内是未知的.

换句话说,编译器在尝试编译查询并在执行result.ToString()时命中数据库,但对CustomerNames的私有变量或foreach方法一无所知.数据库逻辑和本地对象逻辑必须保持独立 - 在本地使用之前完全解析数据库查询结果.

你应该能够像这样写:

var customerNames  = entities.Customer.Select(c => c.CustomerName).ToList();
Run Code Online (Sandbox Code Playgroud)

如果你必须保持在foreach(用于更复杂的逻辑,而不是为这个简单的例子),你仍然需要[]部分(以迫使它来枚举查询结果)涉及任何非LINQ代码之前要解决的LINQ :

var query = from c in entities.Customer
            select c.CustomerName;

var qryList = query.ToList();

List<string> customerNames = new List<string>();

foreach (var result in qryList)
{
    customerNames.Add(result.ToString());  
}
Run Code Online (Sandbox Code Playgroud)