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をデータベースに渡していたようです。とにかく、これがもう1つの修正です。これは、前のステートメントに.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が機能するのは、その場合、ConvertPotentialQueryURLToSeedSQLに変換されるLINQクエリの一部でメソッドが使用されないためです。

のバージョンToListは同じ理由で機能しToListます。データベースからこれまでのクエリからデータをフェッチします。その時点から、通常のC#オブジェクト(別名LINQ to Objects)で作業しています。

于 2012-05-30T11:37:58.297 に答える