28 votes

déclaration if exists en sql vers linq

Quel est l'équivalent linq de l'instruction suivante ?

IF NOT EXISTS(SELECT UserName FROM Users WHERE UserName='michael')
BEGIN
INSERT INTO Users (UserName) values ('michael');
END

Pouvez-vous également suggérer des convertisseurs sql-linq ? J'utilise actuellement LINQPad qui fait un excellent travail en termes d'écriture de code linq où vous pouvez également voir le code sql généré, mais lorsque je clique sur le petit signe linq, rien ne s'affiche.

42voto

tvanfosson Points 268301

Cela ne peut pas être fait dans LINQ2SQL avec une seule déclaration car la syntaxe LINQ et les méthodes d'extension ne supportent pas les insertions. Ce qui suit (en supposant un contexte de données nommé db ) devrait faire l'affaire.

 if (!db.Users.Any( u => u.UserName == "michael" ))
 {
      db.Users.InsertOnSubmit( new User { UserName = "michael" } );
      db.SubmitChanges();
 }

6voto

Michael Points 1649

Méthode d'extension qui implémente la solution de tvanfosson :

  /// <summary>
  /// Method that provides the T-SQL EXISTS call for any IQueryable (thus extending Linq).
  /// </summary>
  /// <remarks>Returns whether or not the predicate conditions exists at least one time.</remarks>
  public static bool Exists<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  {
     return source.Where(predicate).Any();
  }

  /// <summary>
  /// Method that provides the T-SQL EXISTS call for any IQueryable (thus extending Linq).
  /// </summary>
  /// <remarks>Returns whether or not the predicate conditions exists at least one time.</remarks>
  public static bool Exists<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate)
  {
     return source.Where(predicate).Any();
  }

La méthode d'extension serait alors utilisée :

  bool exists = dataContext.Widgets.Exists(a => a.Name == "Premier Widget");

Bien que la combinaison .Where().Any() fonctionne suffisamment, elle facilite certainement le flux logique de la présentation du code.

2voto

Brian Wells Points 812

Mettez le code Exists dans une classe statique. Par exemple, ajoutez une classe à votre projet avec quelque chose comme :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace company.project
{
   static class LinqExtensions
    {
        /// <summary>
        /// Method that provides the T-SQL EXISTS call for any IQueryable (thus extending Linq).
        /// </summary>
        /// <remarks>Returns whether or not the predicate conditions exists at least one time.</remarks>
        public static bool Exists<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
        {
            return source.Where(predicate).Any();
        }

        /// <summary>
        /// Method that provides the T-SQL EXISTS call for any IQueryable (thus extending Linq).
        /// </summary>
        /// <remarks>Returns whether or not the predicate conditions exists at least one time.</remarks>
        public static bool Exists<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate)
        {
            return source.Where(predicate).Any();
        }

    }
}

N'oubliez pas d'ajouter l'espace de nom de cette classe à toute autre classe qui l'utilise. ;P

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X