Avatar billede websam Nybegynder
22. april 2009 - 15:44 Der er 14 kommentarer og
2 løsninger

Linq to sql eller linq to entity

Hejsa,

Jeg har den senere tid kigget nærmere på .net's mvc platform og i denne forbindelse er jeg også begyndt at kigge på Linq to sql og linq to entity.

Men hvilke af de 2 er at anbefale ? Jeg kan se ud fra flere blog indlæg at der har været en større diskution igang om, at Linq to sql skulle være på vej ud/erstattes af linq to entity, men i en video fra MIX09 slås det fast at linq to sql ikke er død.

Hvad skal jeg vælge og hvorfor ?
Avatar billede arne_v Ekspert
22. april 2009 - 16:45 #1
Helt klart LINQ to EF.

LINQ to SQL er ikke deprecated, men saa vidt jeg ved bliver det ikke videreudviklet.

Jeg kan ikke se nogen grund til at starte paa noget som allerede er legacy.
Avatar billede websam Nybegynder
22. april 2009 - 18:18 #2
Ok, men når jeg læser lidt om linq to entity på diverse blogs, snakkes der meget om at det er noget tungere end linq to sql, men der er jo absolut ingen mening i at kaste sig over noget der med tiden vil dø.
Avatar billede arne_v Ekspert
22. april 2009 - 18:31 #3
Der er lidt at saette sig ind i med hensyn til EF, men saa svaert er det jo heller ikke.

Som med alle andre ORM, saa kraever god performance at man ved hvad man laver.
Avatar billede keysersoze Guru
22. april 2009 - 20:11 #4
Enig med arne - LINQ 2 SQL er kun et slags proof of concept og var egentlig ikke tiltænkt som release hvorimod EF er. EF har problemer med performance - mange problemer skyldes at man benytter det forkert men der er også ting man ikke helt er herre over og som i visse tilfælde er umulige at gøre noget ved.
Avatar billede websam Nybegynder
23. april 2009 - 08:54 #5
Ok, jeg læser videre på det.

Et lille off-topic spørgsmål.

Hvis jeg har to tabeller i databasen Kategorier og Produkter med følgende kolonner :

Id, Kategori, Beskrivelse
Id, CatId, Produkt, Beskrivelse

For at trække en liste af kategorier med tilhørende produkter :
Kategori 1
- Produkt 1
- Produkt 2

Kategori 2
- Produkt 3
- Produkt 4

Kategori 3
- Produkt 5
- Produkt 6

har jeg lavet en metode i datalaget getCategoriesWithProducts(), men da jeg laver et kryds over 2 tabeller er der hverken tale om et object af kategorier eller produkter men et annonymt object.

Hvad skal return typen af min metode så være ?

public function EtEllerAndet<> getCategoriesWithProducts()
{
    . . .
    min linq forspørgelse
    . . .
}

Var der tale om en liste af kategorier eller produkter ville jeg jo blot sende den retur som List<>, IEnumerable<>, IQueryable<> eller hvad der nu ville passe til den givne situation.
Avatar billede keysersoze Guru
24. april 2009 - 18:34 #6
tror ikke helt at jeg forstår - så mit første gæt må være at du skal selecte alle kategorier ud og include produkter. Så får du en liste ud af kategorier alle med produkterne under sig. Ellers så skal du ud over de objekter EF giver dig og lave dit eget objekt.
Avatar billede websam Nybegynder
25. april 2009 - 06:26 #7
Ok, et eksempel er måske på sin plads. Hvis jeg laver denne linq i en metode:

public EtEllerAndet<> getCategoriesWithProducts()
    var query = from k in Kategorier
                join p in Produkter on k.Id equals p.CatId
                select new
                {
                    k.Id,
                    k.Kategori,
                    p.Id,
                    p.Produkt
                };
    return query;
}

Så skal min metode have en eller anden return type, men hvad skal det være ?
Avatar billede websam Nybegynder
25. april 2009 - 08:46 #8
Argh . . . det skulle være:

public EtEllerAndet<> getCategoriesWithProducts()
    var query = from k in Kategorier
                join p in Produkter on k.Id equals p.CatId
                select new
                {
                    KatId = k.Id,
                    Kategori = k.Kategori,
                    ProdId = p.Id,
                    Produkt = p.Produkt
                };
    return query;
}
Avatar billede keysersoze Guru
25. april 2009 - 10:00 #9
så vil du returnere din egen type - se fx

http://www.albahari.com/nutshell/10linqmyths.aspx

og

http://blog.dotnetnerd.dk/?tag=/sql

Men umiddelbart ville jeg nok nærmere gå i denne retning

List<Category> lList = this.Repository.CreateQuery<Category>("Category").Include("Product").Where(myCategory => myCategory.IsDeleted == false && myCategory.IsActive == true).ToList<Category>();
Avatar billede websam Nybegynder
26. april 2009 - 12:57 #10
Jeg tror vi snakker forbi hinanden ?

Jeg er med på hvordan jeg laver en query der sender et annonymt object retur, men der hvor jeg ikke kan få det til at virke er at min metode :

public ReturTypeMangler metode()
{
  . . . min query . . .
}

skal sende en type retur.
Avatar billede keysersoze Guru
26. april 2009 - 14:55 #11
så er det sikkert mig der ikke forstår det - for typen du sender retur skal du jo selv definere enten i dit udtræk (som i første link), en af de indbyggede metoder eller ved at efterbehandle det.
Avatar billede websam Nybegynder
26. april 2009 - 16:53 #12
Er det den her du mener ?

######################

A method cannot return a query, if the query ends in the 'new' operator

The trick is to project into an ordinary named type with an object initializer:

public IQueryable<NameDetails> GetCustomerNamesInState (string state)
{
  return
      from c in Customer
      where c.State == state
      select new NameDetails
      {
        FirstName = c.FirstName,
        LastName = c.LastName
      };
}

NameDetails is a class that you'd define as follows:

public class NameDetails
{
  public string FirstName, LastName;
}

#########################
Avatar billede keysersoze Guru
26. april 2009 - 17:11 #13
ja
Avatar billede websam Nybegynder
27. april 2009 - 06:30 #14
Smid et svar begge 2.

keysersoze >> jeg laver lige et spørgsmål med lidt flere point til dig ;o)
Avatar billede keysersoze Guru
27. april 2009 - 18:09 #15
svar :)
Avatar billede arne_v Ekspert
27. april 2009 - 18:28 #16
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