linq的foreach结果不起作用

时间:2009-10-12 17:37:59

标签: 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());  
}

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

5 个答案:

答案 0 :(得分: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();

如果你必须保留foreach(对于更复杂的逻辑,而不是这个简单的例子)你还需要在涉及任何非之前解析Linq to []部分(通过强制它枚举查询结果) -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());  
}

答案 1 :(得分:2)

您可以尝试仅使用ToList()方法而不是foreach吗?

List<string> customerNames = query.ToList();

答案 2 :(得分:1)

如果问题不是ToString() Gart mentioned我的第二个可疑者属于c.CustomerName。这是您的部分类中的自定义属性吗?

此外,异常的堆栈跟踪必须清楚地显示不支持的方法。

答案 3 :(得分:0)

尝试删除.ToString()并查看是否有效:

foreach (var result in query)
{
    customerNames.Add(result);  
}

似乎问题的根源在于LINQ-to-SQL查询转换机制。我想翻译引擎会尝试将.ToString()转换为SQL并在那里失败。

答案 4 :(得分:0)

试试这个

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

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

query.ToList().ForEach(r=>customerNames.Add(r));