我有一行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();
答案 0 :(得分:3)
原因是LINQ to SQL不执行查询的代码,而是尝试将其转换为SQL语句。因为它不知道ConvertPotentialQueryURLToSeed
这种转换失败了。
foreach有效,因为在这种情况下,方法ConvertPotentialQueryURLToSeed
未在LINQ查询中被转换为SQL的部分中使用。
ToList
版本的工作原理与此相同:ToList
从数据库中获取查询中的数据。从那时起,您正在处理普通的C#对象,即LINQ to Objects。