Avatar billede Cars10 Praktikant
18. april 2009 - 12:44 Der er 7 kommentarer og
1 løsning

Brug af Where<> og OrderBy<> på DataTable fra DataSet

Hej

Hvad bruges Where<> og OrderBy<> til og hvordan bruger man dem?
Avatar billede arne_v Ekspert
18. april 2009 - 14:00 #1
Til at:
- udvælge rækker
- sortere
Avatar billede arne_v Ekspert
18. april 2009 - 14:12 #2
Eksempel:

using System;
using System.Data;
using System.Data.OleDb;
using System.Linq;

namespace E
{
    public class MainClass
    {
        public static void Print(DataTable dt)
        {
        }
        public static void Main(string[] args)
        {
            OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb;");
            con.Open();
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT f1,f2 FROM t1", con);
            DataSet ds = new DataSet();
            da.Fill(ds, "t1");
            foreach(DataRow dr in ds.Tables["t1"].Rows)
            {
                Console.WriteLine(dr["f1"] + " " + dr["f2"]);
            }
            var q = ds.Tables["t1"].AsEnumerable().Where((dr) => (int)dr["f1"] > 2).OrderByDescending((dr) => (string)dr["f2"]);
            foreach(var dr in q)
            {
                Console.WriteLine(dr["f1"] + " " + dr["f2"]);
            }
            con.Close();
            Console.ReadKey();
        }
    }
}
Avatar billede Cars10 Praktikant
18. april 2009 - 15:28 #3
Mine datatables ser lidt anderledes ud. Jeg har prøvet at skrive koden om. Jeg forventede egenlig at få DataSet1.TblCharacterDataTable eller tblCharacterRow[] return, men måske griber jeg det forkert an. Her er min kode:

private DataSet1.TblCharacterDataTable GetHighscore2()
{
DataSet1TableAdapters.TblCharacterTableAdapter tblCharacterTableAdapter = new DataSet1TableAdapters.TblCharacterTableAdapter();
DataSet1.TblCharacterDataTable tblCharacterDataTable = new DataSet1.TblCharacterDataTable();
tblCharacterTableAdapter.Fill(tblCharacterDataTable);

return tblCharacterDataTable.Where((tblCharacterRow) => tblCharacterRow.XP > 100);
}

Jeg får følgende fejl:
Error    12    Cannot implicitly convert type 'System.Data.EnumerableRowCollection<DataSet1.TblCharacterRow>' to 'DataSet1.TblCharacterDataTable'
Avatar billede arne_v Ekspert
18. april 2009 - 15:52 #4
Metodens retur type svarer ikke til det som Where returnerer.
Avatar billede Cars10 Praktikant
18. april 2009 - 15:54 #5
Nu har jeg gjort følgende:

private DataTable GetHighscore2()
{
DataSet1TableAdapters.TblCharacterTableAdapter tblCharacterTableAdapter = new DataSet1TableAdapters.TblCharacterTableAdapter();
DataSet1.TblCharacterDataTable tblCharacterDataTable = new DataSet1.TblCharacterDataTable();
tblCharacterTableAdapter.Fill(tblCharacterDataTable);

return tblCharacterDataTable.Where((tblCharacterRow) => tblCharacterRow.XP > 100).CopyToDataTable();
}

Det virker fint. Ville bare have være endnu bedre hvis den havde beholdt typen af min datatable.

Men ser det ellers rigtigt ud hvad jeg har gang i? Jeg kunne selvfølgelig have haft min udsøgning med i TableAdapteren, hvis det ikke bare var for at teste at det virker. Men mister jeg en masse performance ved først at hente hele tabellen for derefter at udsøge på den eller gør det bare det samme som SQL'en ville have gjort?
Avatar billede arne_v Ekspert
18. april 2009 - 22:43 #6
Koden er vel OK.

Jeg tror at du snart skal til at droppe DataSet og enten læse fra en DataReader over i en List<X> eller bruge O/R Mapper.
Avatar billede Cars10 Praktikant
19. april 2009 - 09:30 #7
Ok det må jeg læse op på. Tak for hjælpen. Ligger du et svar?
Avatar billede arne_v Ekspert
19. april 2009 - 15:09 #8
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester