2010-10-20 4 views
1

J'ai un problème SQL que j'utilise encore et encore, mais maintenant que j'ai besoin de faire plus de choses dans LINQ. Comment puis-je faire cela? Y a-t-il un site qui convertit votre sql en linq?Comment représenter une commande exists() sql dans LINQ

conn.Open(); 
SqlCommand command = new SqlCommand(); 
command.Connection = conn; 
//query 
command.Parameters.Add(new SqlParameter("@email", email)); 

//else 
command.CommandText = "if exists(SELECT pk_email FROM MyTable WHERE pk_email = @email) begin " + 
       "UPDATE MyTable SET last_login = getdate(), is_logged_in = 'true' WHERE pk_email = @email; " + 
       "end else begin " + 
       "INSERT INTO MyTable (pk_email, last_login, is_logged_in) VALUES (@email , getdate(), 'true'); " + 
       "end"; 
command.ExecuteNonQuery(); 

Répondre

0

Dans Entity Framework j'utilise habituellement les éléments suivants extension méthode pour obtenir ce que vous voulez (voir le commentaire pour un exemple).

/// <summary> 
    /// Updates and entity and save it to the database. 
    /// If it doesn't exist it creates a new entity and saves it to the database. 
    /// <example> 
    ///  <code> 
    ///   //Updates or inserts a row into Account. The inserted/updated row will have its AccountNumber set to "17". 
    ///   var account = db.Accounts.InsertOrUpdate(a => a.ID == id, a => a.AccountNumber = "17"); 
    ///  </code> 
    /// </example> 
    /// </summary> 
    /// <typeparam name="TEntity"></typeparam> 
    /// <param name="allEntities"></param> 
    /// <param name="entityFilter"></param> 
    /// <param name="propertySetter"></param> 
    /// <returns></returns> 
    public static TEntity InsertOrUpdate<TEntity>(this ObjectSet<TEntity> allEntities, Func<TEntity, bool> entityFilter, 
                Action<TEntity> propertySetter) where TEntity : class, new() 
    { 
     //First we use the entityValueMapper to search for an existing entity. 
     var entity = allEntities.Where(entityFilter).FirstOrDefault(); 
     if (entity == null) 
     { 
      entity = new TEntity(); 
      allEntities.AddObject(entity); 
     } 
     propertySetter(entity); 
     allEntities.Context.SaveChanges(); 
     return entity; 
    } 
+1

Cela semble bien, mais je suis trop novice pour le comprendre. Je viens d'un fond d'asp classique et quand les variables et le type de données peuvent avoir des extras "<>" je me perds. Lire dessus maintenant, cependant. – Kramer

+0

Ouais, c'est un peu abstact car il a été créé pour fonctionner avec n'importe quelle Entity Framwork-entité que vous souhaitez utiliser. Une fois que vous aurez compris les génériques et les fonctions de haut niveau, vous verrez que c'est assez simple :). – Yrlec

1

Vous pouvez faire quelque chose comme ça

if(From emails In MyTable Where emails.pk_email == email).Any) { 
    'Then update your data here 
} 
else { 
    'Insert your data 
} 

Si vous avez besoin d'aide avec les inserts ou les mises à jour sur le datacontext simplement déposer un commentaire.

+0

Est-ce que cela frappe la base de données plus que ce que j'ai écrit? Je sais qu'il y a plus d'une façon de faire quelque chose. Il semble plus propre, puis en utilisant une commande sql, mais quel est le meilleur? – Kramer

0

Quelque chose comme ça? Alors, combien de coups à la base de données cela cause-t-il? Et en utilisant linq ça me protège plus pour l'injection sql?

 
App_DAL.DataDataContext h = new App_DAL.DataDataContext(); 
if ((from emails in MyTables where emails.pk_email == email select emails.pk_email).Any()) { 
    //Then update your data here 
    var messenger = (from emails in MyTables where emails.pk_email == email select emails).Single(); 
    messenger.last_login = DateTime.Now; 
    messenger.is_logged_in = true; 
    h.SubmitChanges(); 
} 
else 
{ 
    //Insert your data 
    App_DAL.MyTable msg = new App_DAL.MyTable(); 
    msg.pk_email = email; 
    msg.is_logged_in = true; 
    msg.last_login = DateTime.Now; 
    h.MyTables.InsertOnSubmit(msg); 
    h.SubmitChanges();

}

Questions connexes