LINQ-querykolommen doorlopen (geen rijen)

Is het mogelijk, en zo ja hoe, om de resultaten van een LINQ-query door te lussen?

Iets zoals dit:

var results= from a in dt.AsEnumerable()
                    where a.Field("id") == i 
                    select new 
                    {
                       id= a.Field("id"),
                       a= a.Field("a"),
                       b = a.Field("b")
                    };

IEnumerable colNames = results.First().GetType().GetProperties()
                                                        .Select(p => p.Name);

string[] columns = colNames.ToArray();

int i = 0;
foreach (var row in results)
{
    for (int i = 0; i < columns.Count(); i++)
    {
        string foobar = (string)row[columns[i]];
        i++;
    }
}

In essentie wil ik het volgende soort functionaliteit repliceren:

DataRow dr = new DataRow();
string foobar = dr[columns[i];

Alvast bedankt.

5
misschien zal dit antwoord je helpen stackoverflow.com/ vragen/1882935/& hellip;
toegevoegd de auteur Ivan Crojach Karačić, de bron
Je moet casten, dus `string foobar = (string) dr [kolommen [i];
toegevoegd de auteur xanatos, de bron
@xantos, goed punt, goed gemaakt.
toegevoegd de auteur CatchingMonkey, de bron

2 antwoord

Als je de mogelijkheid hebt om je oorspronkelijke LINQ-statement te veranderen om een ​​datastructuur te maken waarmee je kunt doen wat je zoekt, zou ik dat zeker aanbevelen.

Als dit niet het geval is, moet u reflectie gebruiken om de eigenschappen van uw anonieme type met hun naam op te zoeken en vervolgens de waarden van die eigenschappen door reflectie te achterhalen:

    PropertyInfo[] columns = results.First().GetType().GetProperties();
    ...
            string foobar = columns[i].GetValue(row, null);
4
toegevoegd
@CatchingMonkey: zie mijn update
toegevoegd de auteur StriplingWarrior, de bron
Ik heb niet echt de optie nee gekregen. Ik heb echter een beetje reflectie gebruikt om de eigenschappen te krijgen, ik weet nu niet meer wat ik ermee moet doen!
toegevoegd de auteur CatchingMonkey, de bron
Action processColumName = (cname) => 
                           { 
                             //do anything you want with a column name
                              string foo = (string) Row[cname]; 
                           };

results.First()
        .GetType()
        .GetProperties()
        .Select(p => p.Name)
        .ToList().ForEach(processColumName);
3
toegevoegd