Pas på med ExecuteCommand i LINQ 2 SQL


ExecuteCommand kan være enormt handy hvis du f.eks synes det er svært at udtrykke dig via LINQ. Jeg har dog erfaret at man skal passe enormt meget på ved at bruge disse indbyggede SQL metoder på DataContext typen.

Lad os sige jeg laver en update på noget data uden om min DataContext klasse. Det kan jeg sagtens, fordi DataContext har metoden ExecuteCommand på sig som ser således ud:

public int ExecuteCommand( string command, params object[] parameters );

public static void Update( int id )
{
    LinqUtil.Db.ExecuteCommand( String.Format( "UPDATE data SET col = NULL WHERE (pk_col = {0})", id ) );
}

Piece of cake :0), nu er min data opdateret i databasen.

Hvis jeg så efterfølgende prøver at opdatere noget af det samme data via LINQ, med SubmitChanges, så vil den opdatering ikke virke korrekt på mine data.

if( id > 0 ) {
    //Update via DataContext's ExecuteCommand, som virker fint.
}

SomeObject obj = null;
foreach( var inst in listOfObjects ) {
    obj = ObjectQueries.GetObject( inst );
    obj.col = id;
    DataContextInstance.SubmitChanges(); //LINQ 2 SQL. Opdatere godt nok værdien, men hver anden gang bliver værdien sat til NULL.
}

Hvis jeg underlader at bruge SQL i den første metode, men derimod LINQ'er mig ud af det virker alt som en drøm:

public static void Update( int id )
{
    var query = ( from objects in DataContextInstance.data
                  where objects.pk_col == id
                  select objects ).ToList();

    foreach( var obj in query ) {
        obj.col = null;
        DataContextInstance.SubmitChanges();
    }
}

Hvor sker det her mon ?


Comments (2)
  1. Janus says:

    Jeg finder mange indl;g rundt omkring paa nettet der omhandler folks tilgang til L2S eller L2E, og hver gang jeg sidder og naerstuderer koden undrer jeg mig over at man overhovedet vil lave en update eller insert via L2S eller L2E. Nu ser jeg saa dit eksempel hvor du netop forklarer om ExecuteCommand, men alligevel proever med SubmitChanges…. IMHO skal man holde sine kode ren for SQL, at du saa lige laver en inline SQL for eksemplets skyld er fint nok, men absolut ikke noget jeg vil anbefale.

    I min verden skal alt CRUD foretages igennem SPs! Glem L2E og L2S til den slags og brug kun teknologierne til reads for at faa et fint og nemt forstaaeligt dal.

Comments are closed.

Skip to main content