2009-10-16 7 views
3

Je suis tout à fait nouveau pour requête LINQ, s'il vous plaît aider à cette requête, ensemble de données a des champs:sélectionnez la colonne de jeu de données en utilisant LINQ

Nom Valeur Client_owner.

Je veux sélectionner la valeur si name == "searchtext"

DataTable results = (from d in ((DataSet)_MyDataset).Tables["Records"].AsEnumerable() 
        orderby d.Field<string>("Name") ascending 
        where d["Name"].ToString().ToLower().Contains(ProjectName.ToLower()) 
        select d??).CopyToDataTable(); 
+0

Pouvez-vous clarifier ce un peu? Essayez-vous de renvoyer des colonnes spécifiques à partir de votre base de données basée sur searchtext? –

+0

oui, j'ai juste besoin du champ "value" dans les résultats de l'ensemble de données où name = searchstr. –

+0

et puis le faire dans listitems, mais ne connaissez pas la syntaxe, s'il vous plaît aider. foreach (point ListItem dans projList) { if (item.Value ??? IndexOf (résultats («valeur) ??, ?? numbercomparison)) { returnItems.Add (point); }} –

Répondre

4
var query = (from d in _MyDataset.Tables["Records"].AsEnumerable() 
           where d.Field<String>("Name").Equals("searchText", StringComparison.CurrentCultureIgnoreCase) 
           select d).OrderBy(x => x.Field<String>("Name")); 

if (query.Count() != 0) { DataTable result = query.CopyToDataTable(); } 

si _MyDataSet est un objet DataSet alors la distribution supplémentaire n'est pas nécessaire dans votre exemple.

puis créer une méthode d'extension pour créer une table de données filtrées:

public static class DataTableExtensions 
{ 
    public static DataTable ReturnColumn(this DataTable dataTable, ICollection<String> fieldNames) 
    { 
     if (fieldNames.Count > 0) 
     { 
      for (int i = 0; i < dataTable.Columns.Count; i++) 
      { 
       DataColumn col = dataTable.Columns[i]; 
       if (!fieldNames.Contains(col.ColumnName)) 
       { 
        dataTable.Columns.Remove(col); 
        i--; 
       } 
      } 
     } 

     return dataTable; 
    } 
} 

alors vous pouvez filtrer votre datatable comme ceci:

results.ReturnColumn(new List<String> { "Value" });

qui renvoie une table de données avec seulement la colonne "Valeur"

+0

Merci , mais pourquoi est si compliqué, est-il possible dans linq requête de sélectionner un champ? Sélectionnez la valeur –

+0

S'il vous plaît laissez-moi savoir comment accéder à ce champ dans cette section: foreach (ArticleArticle dans projList) { if (item.Text.IndexOf (results.Field (value) ???. StringComparison.CurrentCultureIgnoreCase)> -1) { returnItems.Add (élément); } } –

+1

Je suggère de casser la question plutôt que d'essayer d'enchaîner trop de choses ensemble (lire la loi de Demeter http://en.wikipedia.org/wiki/Law_of_Demeter). L'appel 'CopyToDataTable()' lancera une exception InvalidOperationException si aucune ligne n'est retournée par la requête. Affectez la requête séparément, puis 'if (query.Count()! = 0) {DataTable result = query.CopyToDataTable(); } '. –

0

si vous voulez retourner une liste de "valeurs", vous pouvez le faire comme suit:

IList<String> results = (_MyDataset.Tables["Records"].AsEnumerable().Where(
     d => d.Field<String>("Name").Equals("searchText", StringComparison.CurrentCultureIgnoreCase)).Select(
     d => d.Field<String>("Value")).OrderBy(x => x).ToList<String>()); 
+0

les résultats peuvent être datatable au lieu de IList ? Résultats pouvant être obtenus = (_MyDataset.Tables ["Enregistrements"]. AsEnumerable(). Où ( d => d.Field ("Nom"). Equals ("searchText", StringComparison.CurrentCultureIgnoreCase)). Sélectionnez ( d => d. Champ ("Valeur")). OrderBy (x => x) .ToList ()); –

+0

C'est ce que ma première réponse fait. Il n'y a pas moyen de le faire avec une simple requête LINQ; Pour autant que je sache. –

0

La meilleure façon d'obtenir ce que vous voulez faire quelque chose comme ceci:

 DataTable newDataTable = new DataTable("filteredTable"); 
     Func<DataTable, String[], DataRow, DataRow> NewRow = delegate(DataTable targetTable, String[] columns, DataRow srcRow) 
     { 
      if (targetTable == null) 
       throw new ArgumentNullException("targetTable"); 
      if (columns == null) 
       throw new ArgumentNullException("columns"); 
      if (srcRow == null) throw new ArgumentNullException("srcRow"); 

      if (columns.Count() == 0) throw new ArgumentNullException("srcRow"); 

      DataRow row = targetTable.NewRow(); 

      foreach (var column in columns) 
      { 
       if (!targetTable.Columns.Contains(column)) 
        targetTable.Columns.Add(column); 

       row[column] = srcRow[column]; 
      } 


      return row; 
     }; 

     var query = (from d in _MyDataset.Tables["Records"].AsEnumerable() 
        where d.Field<String>("Name").Equals("searchText", StringComparison.CurrentCultureIgnoreCase) 
        select NewRow(newDataTable, new[] { "Value" }, d)); 

     if (query.Count() != 0) { DataTable result = query.CopyToDataTable(); } 

Il n'y a aucun moyen de le faire avec juste LINQ

Questions connexes