不知道这里有什么问题,当我运行应用程序时,在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()也会出现相同的错误。
答案 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));