2017-03-15 8 views
0

LINQ to SQLコードジェネレータを使用して、SQL ServerテーブルからGUIDを読み取るシンプルなデータコンテキストを生成し、次のような単純なLINQ呼び出しを使用して読み取りGUIDにアクセスします。LINQ to SQLのInvalidCastException

ほとんどの部分について
dataContext.MyTable.FirstOrDefault(x => x.ID.Equals(id)) 

は、この呼び出しはうまく動作しますが、私は、まれに、次のエラーなどのエラーが表示されます。誰もが、このエラーは発生しませんなぜ、このエラーが発生する可能性がありますどのような示唆してもらえ

System.InvalidCastException: Unable to cast object of type '<>c__DisplayClass356' to type 'System.Func`1[System.Guid]' 

毎回?

ありがとうございます。

+3

エラーはあなたが行ったクエリに対応していません私たちに示した。エラーは別の場所で発生しています。 'Guid'だけを返す関数を記述しています。あなたの関数はオブジェクトをとり、 'bool'を返します。 – Rob

+0

ここで 'id'の値は何ですか?クエリの結果をどのように割り当てていますか? – DavidG

+0

どのようにIDの値を得た –

答えて

0

この

dataContext.MyTable.FirstOrDefault(x => x.ID.ToString() == id.ToString()); 
0

どうやらクラスMyTableはタイプSystem.Guidの性質IDを持って試してみてください。

idのタイプは指定しません。エラー報告のため、Guidではありません。非常によく働くので、文字列のように簡単にGuidに解析できるものと仮定します。文字列IDが適切なGuidを表していないことがありますか?

他のものは動作しない与えた溶液:

var myTable = dataContext.MyTable.First(); // assume not empty 
Guid myGuid = myTable.ID;     // assume not empty 
string id = myGuid.ToString("X"); 

// The solution suggested by others does not find the element: 
Guid foundGuid = dataContext.MyTable.FirstOrDefault(x => x.ID.ToString() == id.ToString()); 

理由:myGuid.ToString()の結果を別の文字列に、およびidはmyGuidの良い文字列表現であるが、それはmyGuid.ToStringに等しくありません()

次のコードは確かに要素を見つける:

Guid idGuid = Guid.Parse(id); 
Debug.Assert(myGuid.Equals(idGuid); 
Guid foundGuid = dataContext.MyTable.FirstOrDefault(x => x.ID.Equals(idGuid)); 

あなたはidがで、適切なGUID、使用Guid.TryParseであることを特定していない場合Guid.Parse正しいguidを解析していない場合は、MyTableにはないことが確実であるため、linqステートメントを開始しないでください