Вы смотрели на DataTable.Select()
метод?Это немного затянуто, но если все данные уже есть в наборе данных, вы можете использовать что-то вроде:
Dim userRows As DataRow() = DataSet.Tables("User").Select(String.Format("WHERE U_Name = '{0}'", Current_User))
If (userRows.Length = 0) Then
Throw New Exception("User Not Found")
End If
Dim UID As Int32 = Convert.ToInt32(userRows(0).Item(0))
Dim userClassRows As DataRow() = DataSet.Tables("User_Class").Select(String.Format("WHERE U_ID = {0}", UID))
If (userClassRows.Length = 0) Then
Throw New Exception("User Not Found")
End If
Dim classRows As New List(Of DataRow)
For i As Int32 = 0 To userClassRows.Length - 1
classRows.AddRange(DataSet.Tables("Class").Select(String.Format("WHERE C_ID = {0}", classRows(i).Item("C_ID"))))
Next
YourGridView.DataSource = classRows
(я в основном использую C #, поэтому, пожалуйста, извините за любые ошибки / ошибки в моемВ.Б. Надеюсь, что за логикой все еще можно следовать).
Хотя Как и в предыдущем ответе, я бы использовал подход SQL, если нет веской причины не извлекать последний класс непосредственно из базы данных для каждого пользователя.:
SELECT *
FROM Class
WHERE C_ID IN
( SELECT C_ID
FROM User_Class
WHERE U_ID IN (SELECT U_ID FROM user WHERE U_Name = @CurrentUser)
)
ADDENDUM
@ Aprillion поднял хороший вопрос о том, что соединения, вероятно, быстрее, что в основном верно, я предположил, что C_ID и U_ID не являютсяоднозначно запрещено в таблице User_Class, поэтому используется для подзапросов, поскольку это устраняет необходимость в DISTINCT
или GROUP BY
и, как таковое, оптимизирует лучше.Однако, если U_ID и C_ID уникально ограничены в User_Class, тогда может быть полезно использовать объединения в зависимости от вашей РСУБД.SQL-Server оптимизирует оба метода практически одинаково:
![Execution Plan in SQL Server](https://i.stack.imgur.com/JX7P2.png)
В целом, подход SQL, вероятно, полезен, но точный SQL, который вы должны использовать, будет зависеть от вашей RDBMS,структуры данных, индикаторы и ключи.