DataTable Select () с направляющими - PullRequest
1 голос
/ 01 мая 2009

Я пытаюсь построить свое древовидное представление во время выполнения из DataTable, которое возвращается из запроса LINQ. Возвращаемые поля:

NAME = CaseNoteID | ContactDate | ParentNote ТИП = Guid | DateTime | Guid

Поле ParentNote соответствует записи в столбце CaseNoteID. Выбор (фильтр) дает мне ошибку времени выполнения Не удается найти столбец [ea8428e4]. Этот буквенно-цифровой номер является первым разделом одного из руководств. Когда я прохожу через мой фильтр кода = "ParentNote=ea8428e4-1274-42e8-a31c-f57dc2f189a4"

Чего мне не хватает?

var tmpCNoteID = dr["CaseNoteID"].ToString();
                var filter = "ParentNote="+tmpCNoteID;

                DataRow[] childRows = cNoteDT.Select(filter);

Ответы [ 4 ]

6 голосов
/ 01 мая 2009

Попробуйте заключить GUID в одинарные кавычки:

var filter = "ParentNote='"+tmpCNoteID+"'";
1 голос
/ 18 августа 2017

Я знаю, что это старая ветка, но я хотел добавить к ней дополнение. При использовании оператора IN с Guid (например, ParentNote IN (, и т. Д.)) Одинарные кавычки больше не принимаются. В этом случае необходим метод CONVERT (предложенный granadaCoder). (Одиночные кавычки приводят к исключению при сравнении Guid со строкой с оператором '=' ... который мы фактически не используем.)

Подробности: Я унаследовал некоторый устаревший код, который создал большую строку фильтра в формате: MyColumn = '11111111-2222-3333-4444-555555555555' OR MyColumn = '11111111-2222-3333-4444-555555555555' ....

Когда число направляющих (и, следовательно, количество предложений OR) стало слишком большим, это вызвало исключение переполнения стека. Заменив многочисленные предложения OR на предложение IN, я смог установить фильтр без исключения. Но использование предложения IN означает необходимость использования подхода CONVERT.

1 голос
/ 01 мая 2009

это должно работать:

   var tmpCNoteID = dr["CaseNoteID"].ToString();
                var filter = "ParentNote=\""+tmpCNoteID+"\"";

                DataRow[] childRows = cNoteDT.Select(filter);
0 голосов
/ 22 апреля 2011

Вот один метод, который я использую:

            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"));
...