質問

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"));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top