1

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

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

1 回答 1

3

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

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

ToList具有相同原因的版本起作用:ToList从数据库中的查询中获取数据。从那时起,您正在处理普通的 C# 对象,也就是 LINQ to Objects。

于 2012-05-30T11:37:58.297 回答