user5468294
user5468294

Reputation:

'DataTable' does not contain a public instance definition for 'GetEnumerator'

I am trying to get result from DataTable but I am stuck and have no idea what to do. I have public static DataTable VratiKorisnike() which needs to return DataTable resultTable as result because my result is store in resultTable. SO far my function is here

public static DataTable VratiKorisnike()
{
    List<Korisnik> lstADUsers = new List<Korisnik>();
    string sDomainName = "saos";
    string DomainPath = "LDAP://" + sDomainName;

    string output = @"C:\output.txt";

    DirectoryEntry searchRoot = new DirectoryEntry(DomainPath);
    DirectorySearcher search = new DirectorySearcher(searchRoot);


    search.Filter = "(&(objectClass=user)(objectCategory=person))";
    search.PropertiesToLoad.Add("samaccountname");
    search.PropertiesToLoad.Add("usergroup");
    search.PropertiesToLoad.Add("displayname");
    search.PropertiesToLoad.Add("userAccountControl");
    search.PropertiesToLoad.Add("PasswordExpirationDate");
    //search.PropertiesToLoad.Add("DomainGroup");


    DataTable resultsTable = new DataTable();
    resultsTable.Columns.Add("samaccountname");
    resultsTable.Columns.Add("usergroup");
    resultsTable.Columns.Add("displayname");
    resultsTable.Columns.Add("userAccountControl");
    resultsTable.Columns.Add("PasswordExpirationDate");
    //resultsTable.Columns.Add("DomainGroup");


    SearchResult result;
    SearchResultCollection resultCol = search.FindAll();

    if (resultCol != null)
    {
        for (int counter = 0; counter <= (resultCol.Count - 1); counter++)
        {
            string UserNameEmailString = string.Empty;

            result = search.FindOne();

            if ((result.Properties.Contains("samaccountname") && result.Properties.Contains("usergroup")))
            {
                Korisnik korisnik = new Korisnik();
                korisnik.Ime = ((string)(result.Properties["samaccountname"][0]));
                korisnik.Prezime = ((string)(result.Properties["displayname"][0]));
                korisnik.AccountExpired = (DateTime)result.Properties["userAccountControl"][0];
                korisnik.PassNevExp = ((bool)result.Properties["PasswordExpirationDate"][0]);
                korisnik.DomenskaGrupa = ((string)(result.Properties["DomainGroup"][0]));

                DataRow dr = resultsTable.NewRow();

                dr["samaccountname"] = korisnik.Ime;
                dr["displayname"] = korisnik.Prezime;
                dr["userAccountControl"] = korisnik.AccountExpired;
                dr["PasswordExpirationDate"] = korisnik.PassNevExp;
                dr["DomainGroup"] = korisnik.DomenskaGrupa;
                resultsTable.Rows.Add(dr);
                lstADUsers.Add(korisnik);

            }

        }
        var json = JsonConvert.SerializeObject(resultCol, Formatting.Indented);
        var res = json;
        Console.WriteLine(resultCol);
        Console.ReadLine();
        File.WriteAllText(output, json);
    }
    return resultsTable;
}

When I call function to Main I get error

Foreach statement cannot operate on variables of type 'DataTable' because 'DataTable' does not contain a public instance definition for 'GetEnumerator'

foreach (Korisnik korisnik in VratiKorisnike())
{
    Console.WriteLine(korisnik);
}

I try something like this:

foreach(DataTable dt in  VratiKorisnike())
{
    Console.WriteLine(dt);
}

The error is VratiKorisnike() Any idea how to resolve this issue ?

Upvotes: 0

Views: 1146

Answers (2)

Salah Akbari
Salah Akbari

Reputation: 39976

You need to use the Rows property:

foreach (var korisnik in VratiKorisnike().Rows)

It Represents a collection of rows for a DataTable, and . Actually it will compiles like this and as you can see, because of GetEnumerator you can use your loop with that:

IEnumerator enumerator = VratiKorisnike().Rows.GetEnumerator();
try
{
    while (enumerator.MoveNext())
    {
        DataRow value = (DataRow)enumerator.Current;
        Console.WriteLine(value);
    }
}
finally
{
    IDisposable disposable = enumerator as IDisposable;
    if (disposable != null)
    {
        disposable.Dispose();
    }
}

Upvotes: 0

vc 74
vc 74

Reputation: 38179

To use a DataTable as an IEnumerable<DataRow>, you need to use Linq To DataSet, in perticular AsEnumerable

foreach (DataRow row in VratiKorisnike().AsEnumerable())
{
    string displayName = row.Field<string>("displayname")
    ...
}

Upvotes: 2

Related Questions