SELECT DISTINCT в RowFilter DataView
Вопрос
Я пытаюсь сузить строки в моем DataView на основе связи с другой таблицей, и RowFilter, который я использую, выглядит следующим образом:
dv = new DataView(myDS.myTable,
"id IN (SELECT DISTINCT parentID FROM myOtherTable)",
"name asc",
DataViewRowState.CurrentRows);
Таблицы «myTable» и «myOther» связаны через myTable.ID и myOtherTable.parentID, поэтому идея состоит в том, что DataView должен содержать только строки из «myTable», которые имеют соответствующие дочерние строки в «myOtherTable».
К сожалению, я получаю эту ошибку;
Ошибка синтаксиса:Отсутствует операнд после «Отличного» оператора.
Насколько мне известно, с SQL все в порядке, поэтому мне интересно, есть ли какое-то ограничение на использование ключевого слова DISTINCT как части SQL RowFilter?У кого-нибудь есть идеи?
Решение
К сожалению, я не думаю, что вы можете выполнить подзапрос в выражении фильтра DataView.В некоторых выражениях разрешено использовать только подмножество SQL (документировано). здесь).
Вероятно, вам потребуется выполнить подзапрос (SELECT DISTINCT parentID FROM myOtherTable
) в отдельности.
Эта статья описывает проблему и возможное решение.
Другие советы
К сожалению, вы не можете сделать это таким образом, поскольку свойство RowFilter не поддерживает ключевое словоdependent.Вот список выражений, которые вы можете выполнить в RowFilter (который представляет собой просто выражение DataColumn): http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx
DataViews имеют метод ToTable, а некоторые перегрузки принимают логическое значение, чтобы указать, следует ли возвращать только отдельные строки.
Вот один из методов: http://msdn.microsoft.com/en-us/library/wec2b2e6.aspx
Вот как вы бы его использовали:
DataTable newDataTable = myDataView.ToTable( true, [массив имен столбцов в виде строк]);
DataView dvBindAssignedByDropDown = new DataView();
DataTable dtBindAssignedByDropDown = new DataTable();
dvBindAssignedByDropDown = ds.Tables[0].DefaultView;
string[] strColnames=new string[2];
strColnames[0] = "RedNames";
strColnames[1] = "RedValues";
dtBindAssignedByDropDown = dvBindAssignedByDropDown.ToTable(true, strColnames);
ddlAssignedby.DataTextField = "RedNamesNames";
ddlAssignedby.DataValueField = "RedNames";
ddlAssignedby.DataSource = dtBindAssignedByDropDown;
ddlAssignedby.DataBind();
ddlAssignedby.Items.Insert(0, "Assigned By");
ddlAssignedby.Items[0].Value = "0";
Следующий код извлекает различные значения/записи из таблицы/DataView, а именно (prod_desp_trn), имеющего поле (container_no) Наконец, этот код заполняет комбинированный (cmbcontainerno) с уникальными значениями/записями
Декларация уровня формы:
Dim dsLocal As DataSet
Dim dvm As DataViewManager
Private Sub FillcomboContainer()
Try
Dim dv As DataView = New DataView
cmbContainerNo.DataSource = Nothing
dv = dvm.CreateDataView(dsLocal.Tables("PROD_DESP_TRN"))
dv.Sort = "CONTAINER_NO"
cmbContainerNo.DataSource = dv.ToTable(True, "CONTAINER_NO")
cmbContainerNo.DisplayMember = "CONTAINER_NO"
Catch ex As Exception
MsgBox(ex.Message)
Finally
End Try
End Sub
Попробуйте просто пропустить «DISTINCT».В этом случае результаты должны быть одинаковыми как с добавкой, так и без нее.Устраните неполадки оттуда.