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

时间:2012-05-30 11:31:39

标签: c# linq-to-sql

我有一行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;

出了什么问题,为什么?

==========编辑==========

奇怪,一位同事提出了另一个有效的解决方案。看起来LINQ正在将ConvertPotentialQueryURLToSeed传递给数据库!无论如何这里是另一个修复,即将.ToList()添加到前一个语句:

        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();

1 个答案:

答案 0 :(得分:3)

原因是LINQ to SQL不执行查询的代码,而是尝试将其转换为SQL语句。因为它不知道ConvertPotentialQueryURLToSeed这种转换失败了。

foreach有效,因为在这种情况下,方法ConvertPotentialQueryURLToSeed未在LINQ查询中被转换为SQL的部分中使用。

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