2013-02-25 4 views
2

Я проверил этот вопрос here, а также ряд других ссылок все предлагающие подобные решения, но когда я иду distinctTable = dt.DefaultView.ToTable(true, "FILENAME"); я получаю сообщение об ошибке, говорящее:Выбор отдельных записей из DataTable

поле или свойство с именем «LOCATION» не было найдено на выбранном источнике данных .

Теперь у меня есть четыре столбца: местоположение, папка, имя файла и статус. Значения для Folder и Filename, которые я выбираю из базы данных, но значения для местоположения и состояния определяются через код C#. Я понятия не имею, почему он говорит, что столбец Location не найден, потому что он отлично работает, когда я опускаю вышеприведенную строку.

Я не думаю, что могу использовать SQL, потому что некоторые из записей генерируются пользовательским вводом (т. Е. Они не поступают из базы данных).

Я также попытался

view = new DataView(dt); 
distinctTable = view.ToTable(true, "LOCATION", "FOLDER", "FILENAME", "STATUS"); 

или просто distinctTable = view.ToTable(true, "FILENAME"); для последнего утверждения, но это, кажется, не делать ничего - это не сгенерирует исключение, но это не исключает повторяющиеся записи либо.

Что я делаю неправильно?

+0

Когда вы отлаживаете, в каком заявлении конкретно вы получаете сообщение об ошибке? – Mr47

+0

в инструкции привязки: gridview1.DataBind(); – user1985189

+0

Значит, вы на самом деле получаете ошибку, когда вы привязываетесь к ... что? Отличная таблица? –

ответ

0

Как насчет использования LINQ?

var items = yourdatatable.AsEnumerable().Distinct();

+0

Я пробовал distinctTable = dt.AsEnumerable(). Distinct(). CopyToDataTable(); - не работает. Опять же, он не будет вызывать ошибку, но не исключает дублирования. – user1985189

+0

Возможно, DataRow не реализует IEquitable <>. Вы пробовали это http://stackoverflow.com/questions/14165335/linq-select-distinct-on-datatable-not-working – user826840

3

Он читает, как будто есть два вопрос:

  1. Вы получаете сообщение об ошибке, когда вы к привязке (я предполагаю) производные таблицы;
  2. Если вы попробуете что-то еще, вы не получите ошибку, но вы также не получите требуемые отдельные записи.

код проводке на вершине:

distinctTable = dt.DefaultView.ToTable(true, "FILENAME"); 

... собирается дать вам таблицу данных с точно один столбец: FILENAME. Поэтому, когда вы привязываетесь к нему, вы получите сообщение об ошибке, если то, что вы связываете, также ищет столбец LOCATION.

код проводка в нижней части:

view = new DataView(dt); 
distinctTable = view.ToTable(true, "LOCATION", "FOLDER", "FILENAME", "STATUS"); 

... не бросает ошибку, поскольку она имеет расположение (и другие столбцы) в качестве части таблицы, поэтому управление свяжет к тому, в состоянии найти все столбцы.

Но вы говорите, что он не удаляет дубликаты. Мне интересно, когда вы говорите, что хотите удалить дубликаты, но покажите код, в котором вы указываете только один столбец для вывода, хотите ли вы не отфильтровывать точные копии всей записи, а отфильтровывать записи, которые имеют одно и то же значение FILENAME, но разные значения других столбцов.

Вы не можете (насколько мне известно) сделать это с помощью DataView.ToTable.Но вы можете сделать это с помощью LINQ:

DataTable distinctTable = dt.AsEnumerable() 
          .GroupBy(r=> r.Field<string>("FILENAME")) 
          .Select(g=>g.First()) 
          .CopyToDataTable(); 
+0

Да, я прав, я хочу, чтобы фильтр был основан только на имени файла. Не имеет значения, отличаются ли другие столбцы. Я пробовал ваш код LINQ, но он дает мне ошибку в первой части: dt.AsEnumerable () - говорит, что он не содержит определения для AsEnumerable – user1985189

+1

Попробуйте добавить в свой проект сборку 'System.Data.DataSetExtensions'. –

+0

Я пробовал, но похоже, что у меня нет такой сборки? Это говорит мне, что нет DataSetExtensions в System.Data ... – user1985189