2009-03-02 3 views
4

J'essaie d'affiner les lignes de mon DataView en fonction d'une relation avec une autre table, et le RowFilter que j'utilise est comme suit;SELECT DISTINCT dans le RowFilter de DataView

dv = new DataView(myDS.myTable, 
       "id IN (SELECT DISTINCT parentID FROM myOtherTable)", 
       "name asc", 
       DataViewRowState.CurrentRows); 

Table « myTable » et « myOther » sont liés par myTable.ID et myOtherTable.parentID, et donc l'idée est que le DataView ne doit contenir que des lignes de « myTable » qui ont des lignes d'enfant correspondantes dans « myOtherTable ".

Malheureusement, j'obtiens cette erreur;

Syntax error: Missing operand after 'DISTINCT' operator.

Le SQL est très bien pour autant que je sache, donc je me demande est-il une limitation sur l'utilisation du mot-clé DISTINCT dans le cadre de SQL RowFilter? Quelqu'un a quelquonque idée?

Répondre

5

Malheureusement, je ne pense pas que vous pouvez effectuer une sous-requête dans une expression de filtre DataView. Vous êtes seulement autorisé à utiliser un sous-ensemble de SQL dans certaines expressions (documenté here).

Vous devrez probablement exécuter votre sous-requête (SELECT DISTINCT parentID FROM myOtherTable) séparément.

This article décrit le problème et une solution possible.

+0

j'ai décidé de contourner le problème en créant ma propre liste distincte de parentIDs et puis juste passer cette liste dans un « id IN (...) » clause (qui est heureusement soutenu , contrairement à DISTINCT ou GROUP BY). Salutations –

1

Essayez d'omettre le "DISTINCT". Dans ce cas, les résultats doivent être les mêmes avec ou sans. Dépannez à partir de là.

2

This question vous montrera comment créer un ensemble distinct (en fait un nouveau datatable) en utilisant un DataView sur une table. L'approche est légèrement différente de ce que vous faites ci-dessus.

3

Malheureusement, vous ne pouvez pas le faire de cette façon, car la propriété RowFilter ne prend pas en charge le mot clé distinct. Voici la liste des expressions que vous pouvez effectuer dans un RowFilter (qui est juste une expression DataColumn): http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx

DataViews a une méthode ToTable, et plusieurs surcharges prennent un booléen pour spécifier s'il faut renvoyer uniquement les lignes distinctes.

Voici une méthode: http://msdn.microsoft.com/en-us/library/wec2b2e6.aspx

Voici comment vous l'utiliser:

DataTable newDataTable = myDataView.ToTable (true, [tableau de noms de colonnes sous forme de chaînes]);

2

le code suivant est d'extraire des valeurs distinctes/enregistrements d'une table/dataview, à savoir (PROD_DESP_TRN) champ ayant (CONTAINER_NO) Enfin, ce code est le remplissage d'un combobox (cmbContainerNo) avec des valeurs uniques/dossiers

Formulaire niveau Déclaration:

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 
1
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"; 
+3

À l'avenir, essayez d'ajouter quelque chose de plus que le code, quelle que soit sa valeur. –

Questions connexes