C# 为什么这个foreach循环的LINQ版本抛出NotSupportedException(“NotSupportedException”)?

C# 为什么这个foreach循环的LINQ版本抛出NotSupportedException(“NotSupportedException”)?,c#,linq-to-sql,C#,Linq To Sql,我有一行LINQ代码抛出System.NotSupportedException return unconvertedUrls .Select(potentialQueryURL => ConvertPotentialQueryURLToSeed(potentialQueryURL)) .Where(id => id > 0) .ToList();

我有一行LINQ代码抛出System.NotSupportedException

        return unconvertedUrls
                   .Select(potentialQueryURL => ConvertPotentialQueryURLToSeed(potentialQueryURL))
                   .Where(id => id > 0)
                   .ToList();
异常消息为“方法'Int32 ConvertPotentialQueryURLToSeed(SeedsSQLConnector.PotentialQueryURL)'不支持转换为SQL”

但是,到foreach循环的简单转换运行起来没有问题

        var result = new List<int>();
        foreach (var potentialQueryURL in unconvertedUrls)
        {
            var id = ConvertPotentialQueryURLToSeed(potentialQueryURL);
            if (id > 0)
            {
                result.Add(id);
            }
        }
        return result;

原因是LINQtoSQL不执行该查询代码,而是尝试将其转换为SQL语句。由于它不知道
ConvertPotentialQueryURLToSeed
此转换失败

foreach之所以有效,是因为在这种情况下,在LINQ查询转换为SQL的部分中没有使用方法
ConvertPotentialQueryURLToSeed


带有
ToList
的版本的工作原理与此相同:
ToList
从数据库的查询中获取数据。从那时起,您正在处理普通的C#对象,即LINQ to对象。

我怀疑您正在使用EF或NHibernate,问题是ORM无法将您输入的内容转换为SQL。你的功能是什么?你能给我们看看吗?您的第二个示例之所以有效,是因为您没有查询数据库。谢谢Daniel,我将在六分钟后将此标记为答案。有没有办法告诉LINQ函数是本地函数而不是数据库函数?将ToList()添加到上一条语句似乎可以做到这一点(请参见编辑到问题),但是否有更可读的方法?@Dumblead您的编辑工作正常,因为您已使用
ToList
解析列表,并在第二条语句中对内存集合有效执行LINQ,因此第二条语句不会调用数据库。@Dumblead:No,没有其他方法了。再次感谢Daniel,我错误地认为LINQ对SQL和LINQ对对象的行为是相同的。我现在知道他们不是,这是我需要小心的事情。
        var unconvertedUrls = (from url in _DataContext.PotentialQueryURLs
                               where !convertedUrlIds.Contains(url.Id)
                               select url).ToList();
        return unconvertedUrls
                   .Select(potentialQueryURL => ConvertPotentialQueryURLToSeed(potentialQueryURL))
                   .Where(id => id > 0)
                   .ToList();