web-dev-qa-db-fra.com

Linq sur DataTable: sélectionnez une colonne spécifique dans la table datatable, pas entière

J'exécute une requête LINQ sur un datatable en c #.

Je souhaite sélectionner des colonnes spécifiques plutôt que la ligne entière et entrer le résultat dans un datatable. Comment puis je faire ça??

Mon code:

public DataTable getConversions(string c_to, string p_to)
{
    var query = from r in matrix.AsEnumerable()
                where r.Field<string>("c_to") == c_to &&
                      r.Field<string>("p_to") == p_to
                select r;

    DataTable conversions = query.CopyToDataTable();
9
Uri Klar

Si vous savez déjà combien de colonnes votre nouveau DataTable aurait, vous pouvez faire quelque chose comme ceci:

DataTable matrix = ... // get matrix values from db

DataTable newDataTable = new DataTable();
newDataTable.Columns.Add("c_to", typeof(string));
newDataTable.Columns.Add("p_to", typeof(string));

var query = from r in matrix.AsEnumerable()
            where r.Field<string>("c_to") == "foo" &&
                    r.Field<string>("p_to") == "bar"
            let objectArray = new object[]
            {
                r.Field<string>("c_to"), r.Field<string>("p_to")
            }
            select objectArray;

foreach (var array in query)
{
    newDataTable.Rows.Add(array);
}
10
OJ Raqueño

Ici, je ne reçois que trois colonnes spécifiques de mainDataTable et j'utilise le filtre

DataTable checkedParams = mainDataTable.Select("checked = true").CopyToDataTable()
.DefaultView.ToTable(false, "lagerID", "reservePeriod", "discount");
8
Leax

Essayez Access DataTable plus simple qui peut vous aider à avoir une idée parfaite pour accéder à DataTable, DataSet en utilisant Linq ...

Considérons l'exemple suivant, supposons que nous ayons DataTable comme ci-dessous.

DataTable ObjDt = new DataTable("List");
ObjDt.Columns.Add("WorkName", typeof(string));
ObjDt.Columns.Add("Price", typeof(decimal));
ObjDt.Columns.Add("Area", typeof(string));
ObjDt.Columns.Add("Quantity",typeof(int));
ObjDt.Columns.Add("Breath",typeof(decimal));
ObjDt.Columns.Add("Length",typeof(decimal));

Voici ci-dessus le code de DatTable, ici nous supposons que certaines données sont disponibles dans ce DataTable, et nous devons lier la vue Grid of particulier en traitant certaines données comme indiqué ci-dessous.

Zone | Quantité | Souffle | Longueur | Prix = Quantité * souffle * Longueur

Que nous devons déclencher la requête suivante qui nous donnera le résultat exact que nous voulons.

var data = ObjDt.AsEnumerable().Select
            (r => new
            {
                Area = r.Field<string>("Area"),
                Que = r.Field<int>("Quantity"),
                Breath = r.Field<decimal>("Breath"),
                Length = r.Field<decimal>("Length"),
                totLen = r.Field<int>("Quantity") * (r.Field<decimal>("Breath") * r.Field<decimal>("Length"))
            }).ToList();

Il nous suffit d'affecter cette variable de données comme source de données.

En utilisant cette simple requête Linq, nous pouvons obtenir toutes nos acceptations, et nous pouvons également effectuer toutes les autres requêtes LINQ avec ceci…

7
Sagar Upadhyay

LINQ est très efficace et facile à utiliser sur les listes plutôt que sur DataTable. Je peux voir que les réponses ci-dessus ont une boucle (pour, foreach), que je ne préférerai pas.

Donc, la meilleure chose à faire pour sélectionner une colonne perticulaire à partir d'un DataTable est simplement d'utiliser un DataView pour filtrer la colonne et l'utiliser comme vous le souhaitez.

Trouvez-le ici comment faire.

DataView dtView = new DataView(dtYourDataTable);
DataTable dtTableWithOneColumn= dtView .ToTable(true, "ColumnA");

Maintenant, le DataTable dtTableWithOneColumn contient une seule colonne (ColumnA).

6
Tapan kumar

Votre instruction select renvoie une séquence de type anonyme, pas une séquence de DataRows. CopyToDataTable () n'est disponible que sur IEnumerable<T>T est ou dérive de DataRow. Vous pouvez sélectionner r l'objet ligne pour appeler CopyToDataTable dessus.

var query = from r in matrix.AsEnumerable()
                where r.Field<string>("c_to") == c_to &&
                      r.Field<string>("p_to") == p_to
                 select r;

DataTable conversions = query.CopyToDataTable();

Vous pouvez également implémenter CopyToDataTable Où le type générique T n'est pas un DataRow.

3
Adil