2012-05-08 11 views
6

ten sposób obecnie jestem wybierając dane z bazy danych:Jak wybrać dane do listy <T> zamiast DataTable?

public DataTable GetData() 
{ 
    DataTable table = new DataTable("Table"); 
    using (SqlConnection connection = new SqlConnection("Connection string")) 
    { 
     SqlCommand command = new SqlCommand(); 
     command.Connection = connection; 
     command.CommandType = System.Data.CommandType.Text; 
     command.CommandText = "query string"; 

     connection.Open(); 
     SqlDataAdapter adapter = new SqlDataAdapter(command); 
     adapter.Fill(table); 
    } 
    return table; 
} 

jednak powrócić DataTable i chcę, aby wybrać Lista zamiast DataTable. W ten sposób:

public List<MyClass> GetData() 
{ 
    DataTable table = new DataTable("Table"); 
    using (SqlConnection connection = new SqlConnection("Connection string")) 
    { 
     SqlCommand command = new SqlCommand(); 
     command.Connection = connection; 
     command.CommandType = System.Data.CommandType.Text; 
     command.CommandText = "query string"; 

     connection.Open(); 
     SqlDataAdapter adapter = new SqlDataAdapter(command); 
     adapter.Fill(table); 
    } 
    ... 
    return [List of MyClass]; 
} 

Jak mogę to zrobić?

Dzięki!

+2

Czy ty na pewno chcesz użyć niskiego poziomu połączeń ADO.NET zamiast LINQ do SQL lub Entity Framework? –

+0

Nie jestem pewien. Ale myślę, że niski poziom ADO.NET będzie szybszy. – WaterDance

+0

Tak, ADO.NET będzie szybszy, ale ten przyrost prędkości ma wpływ na twoje otoczenie? –

Odpowiedz

3

Polecam używanie dapper-dot-net, jeśli nie chcą kopać w LINQ to SQL lub Entity Framework. Przerzucanie się wokół siebie z IDataReader w celu zmaterializowania twojego wyniku nie jest warte wysiłku w większości przypadków.

+0

Dziękujemy za link. – WaterDance

1

Jeśli używasz podejścia ADO.NET - otrzymasz tabelę danych i możesz przekonwertować ją na listę lub liczbę wewnętrzną.

Alternatywnie, można zajrzeć do narzędzi ORM takich jak nHibernate lub używać LINQ to SQL

3

Spróbuj tego kodu.

public List<MyClass> GetData() 
{ 
    DataTable table = new DataTable("Table"); 
    using (SqlConnection connection = new SqlConnection("Connection string")) 
    { 
     SqlCommand command = new SqlCommand(); 
     command.Connection = connection; 
     command.CommandType = System.Data.CommandType.Text; 
     command.CommandText = "query string"; 
     connection.Open(); 
     SqlDataAdapter adapter = new SqlDataAdapter(command); 
     adapter.Fill(table); 
     List<MyClass> list=new List<MyClass>(); 
     foreach(DataRow row in table) 
     { 
      MyClass instance = new MyClass(); 
      instance.ID = row["ID"]; 
      //similarly for rest of the properties 

      list.Add(instance); 
     } 

    } 

    return list; 
} 
+0

@WaterDance: Sprawdź zaktualizowaną odpowiedź. – jams

+0

dapper-dot-net był pomocny link. Niestety nie mam uprawnień do głosowania. – WaterDance

+0

-1. Dosłownie nie ma już potrzeby pisania takiego kodu. – tomfanning

4

Jeśli chcesz użyć DataRowCollection aby zapełnić listę obiektów niestandardowych można użyć LINQ oraz inicjator obiektu:

var lst = table.AsEnumerable().Select(r => 
    new MyObject 
    { 
     FirstProperty = r.Field<int>("FirstProperty"), 
     OtherProperty = r.Field<string>("OtherProperty") 
    }).ToList();