Avatar billede mjdigital Nybegynder
23. juni 2010 - 00:50 Der er 10 kommentarer og
1 løsning

Enities & Datatable

Hejsa :) Sidder med et problem med Entity/C#

Min kode ser sådan her ud

ForumEntities _entities = new ForumEntities();

    public DataTable GetCategories()
    {
        DataTable Categories = _entities.Categories;
        return Categories;
     
    }

Vil simpelthen bare ha Categories i min database smidt i en Datatabel og så henter jeg funktionen ud på en anden side.

får følgende fejl "Cannot implicitly convert type 'System.Data.Objects.ObjectQuery<ForumModel.Category>' to 'System.Data.Datatable"
Avatar billede arne_v Ekspert
23. juni 2010 - 03:01 #1
Jeg vil mene at du enten skal bruge DataSet/DataTable eller Entity Framework - du skal ikke forsøge at blande dem.
Avatar billede mjdigital Nybegynder
23. juni 2010 - 23:41 #2
Problemet er jeg ik aner hvordan pokker jeg så henter alle Categories ud vha. Entities :)
Avatar billede Syska Mester
23. juni 2010 - 23:51 #3
public IList<ForumModel.Category> GetCategories()
    {
        IList<ForumModel.Category> Categories = _entities.Categories.ToList();
        return Categories;
   
    }

Måske noget ala over stående ... uden at være sikker.
Avatar billede mjdigital Nybegynder
24. juni 2010 - 00:04 #4
Fik klaret den selv :)
Avatar billede mjdigital Nybegynder
24. juni 2010 - 00:05 #5
svaret var følgende :)

    public List<Category> GetCategories()
    {
        return _entities.Categories.ToList<Category>();
    }
Avatar billede Syska Mester
24. juni 2010 - 00:08 #6
Ja, næsten som jeg også skrev.
Avatar billede windcape Praktikant
27. juni 2010 - 01:02 #7
En bedre løsning ville klart være at bruge en iterator , dvs. IEnumerable<Category>, frem for at bruge en liste.

Problemet er overordnet at _entities.Categories er et query object, som når du henter data, bliver transformeret direkte til SQL, frem for at blive transformeret i memory.

Ved at bruge en IEnumerable opnår du generelt bedre kode, og sikre at fremtigt brug af dit repository er mere fornuftigt og konsistent.

Samt du muligvis undgå dobbelt memoryforbrug.

Der er sådan set heller ingen grund til at pakke din data ind i en DataTabel, da LINQ2SQL/EntityFramework netop er til for at undgå dette. Du kan sagtens databinde direkte til en IEnumerable<T>

så altså:

var categories = _entities.Categories.AsEnumerable();
Avatar billede Syska Mester
27. juni 2010 - 01:18 #8
Tror ikke han er helt henne i de tanker endnu, da der tydeligt var andre problemer der kom først :-) ... men fight bad code er altid godt.

Hvem siger ikke det er kald fra BS ... hvor alle categories skal bruges. Uden at kende context hvor det bruges, synes jeg ikke man kan kan sige hvad der skal bruges. Husk der er både pros/cons i at bruge IQueryable etc.
Avatar billede windcape Praktikant
27. juni 2010 - 01:28 #9
Men også hvis alle kategorierne skal bruges, vil jeg stadigvæk bruge en IEnumerable.

Og ja, det kræver at man holder tungen lige i munden at bruge IQueryable. Men generelt er det fornuftigt at gennemtænke logikken.

Modsat så tror jeg ikke at mjdigital helt er klar over den dybere mening. Så hvis vi bare kan sikre os at han ikke bruger DataTable og DataReaders, er det fint fint :)

Scott Hanselman skrev en fint post om det for et stykke tid siden, http://www.hanselman.com/blog/ExtendingNerdDinnerExploringDifferentDatabaseOptions.aspx
Avatar billede Syska Mester
27. juni 2010 - 01:34 #10
Ja, det skal gennemtænkes og du skal sikre dig kloge programmører i den anden ende :-)

Da den stadig ikke er transformed, kan du jo bygge videre på den query hvilket kan gå hen og give perf issues. Men ja, ved alle hvad der sker, så er det intet problem.

Vil da lige kigge forbi Scott.
Avatar billede mjdigital Nybegynder
27. juni 2010 - 12:32 #11
Tak for svarene :-) og bare rolig ingen datatable... vil da klart lige kigge på det anden... og kalder pt. Min liste ind som et objekt og binder den..
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

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