DataTable Select()with Guids
質問
LINQクエリから返されたDataTableから実行時にツリービューをボイルしようとしています。返されるフィールドは次のとおりです。
NAME = CaseNoteID | ContactDate |親注 タイプ=ガイド|日時|ガイド
ParentNoteフィールドは、CaseNoteID列のエントリと一致します。 Select(filter)により、 列が見つからない[ea8428e4]の実行時エラーが表示されます。 その英数字は、いずれかのGUIDの最初のセクションです。コードフィルター= " ParentNote = ea8428e4-1274-42e8-a31c-f57dc2f189a4"
不足しているものは何ですか?
var tmpCNoteID = dr["CaseNoteID"].ToString();
var filter = "ParentNote="+tmpCNoteID;
DataRow[] childRows = cNoteDT.Select(filter);
解決
GUIDを一重引用符で囲んでみてください:
var filter = "ParentNote='"+tmpCNoteID+"'";
他のヒント
これは動作するはずです:
var tmpCNoteID = dr["CaseNoteID"].ToString();
var filter = "ParentNote=\""+tmpCNoteID+"\"";
DataRow[] childRows = cNoteDT.Select(filter);
これは古いスレッドであることは知っていますが、補遺を追加したかったのです。 GuidでIN演算子を使用する場合(例:ParentNote IN(、など))、一重引用符は使用できなくなりました。その場合、CONVERTメソッド(granadaCoderが推奨)が必要です。 (単一引用符は、Guidを文字列と「=」演算子で比較することについて例外を発生させます...実際には使用していません。)
詳細:次の形式で大きなフィルター文字列を作成するレガシーコードを継承しました: MyColumn = '11111111-2222-3333-4444-555555555555' OR MyColumn = '11111111-2222 -3333-4444-555555555555 '....
GUIDの数(およびOR句の数)が大きくなりすぎると、スタックオーバーフロー例外が発生しました。多数のOR句をIN句に置き換えることで、例外なくフィルターを設定できました。ただし、IN句を使用すると、CONVERTアプローチを使用する必要があります。
私が使用する方法の1つを次に示します。
MyStrongDataSet ds = new MyStrongDataSet();
Guid myUuid = new Guid("11111111-2222-3333-4444-555555555555");
System.Data.DataRow[] rows = ds.MyStrongTable.Select("MyGuidProperty = (CONVERT('" + myUuid.ToString("N") + "', 'System.Guid'))");
//Fish out a single row if need be and cast to a strong row
if (null != rows)
{
if (rows.Length > 0)
{
MyStrongDataSet.MyStrongTableRow returnRow = rows[0] as MyStrongDataSet.MyStrongTableRow;
return returnRow;
}
}
return null;
わずかなバリエーションがあります:
string filterSql = "MyGuidProperty ='{0}'";
filterSql = string.Format(filterSql, Guid.NewGuid().ToString("D"));