1

さて、私は現在、別の文字列リストに存在しないリスト内のすべての文字列を見つけようとしています。これが私のコードが現在どのように見えるかです:

var items = GetLiveItems(); // Returns List<string>
var currentItems = GetCurrentItems(); // Returns List<string>, Exception here

var rogueItems = items.Where(i => !currentItems.Contains(i)).ToList();

上記のコードを実行すると、2 行目に System.NullReferenceException が発生します。3 行目 (items.Where...) を削除すると、例外はなくなります。2 つのリストはかなり大きく、最初は 180k 文字列、2 つ目は 290k 文字列ですが、それぞれ 12 文字しかありません。

問題は何ですか?

編集:

public static List<string> GetCurrentItems()
{
    var db = DatabaseFactory.CreateDatabase("DB");
    var command = db.GetStoredProcCommand("getItems");

    var items = new List<string>();

    using (var reader = SafeSqlReader(db.ExecuteReader(command)))
    {
        while (reader.Read()) items.Add(reader.GetString("name"));
    }

    return items;
}

編集:

したがって、以下のコードを使用します。

var rogueItems = items.Except(currentItems).ToList();

働きました。私の以前の方法がうまくいかなかった理由を誰か説明できますか? そして、他の提案された方法。

編集:

だから、これをプロジェクトで再現するのに苦労しているので、みんなと共有して見てみることができるので、このスクリーンショットを提供して、私が狂っていないことを証明したいと思います.

原因不明の例外

編集:

次に示すのは、Except ロジックのスクリーン ショットです。以前に例外が発生した行を正常にステップオーバーしたことがわかります。

ここも例外ではありません

4

2 に答える 2

1

EXCEPTLinqメソッドを使用してみてください-http ://code.msdn.microsoft.com/LINQ-Set-Operators-374f34feではなくWHERE !Contains

于 2012-09-13T22:29:00.030 に答える
1

遅延読み込みの問題のように聞こえます。linq では、結果を列挙するまでクエリは実際には実行されません。したがって、問題はおそらく SQL 生成にあります。

于 2012-09-13T22:15:02.707 に答える