если существует заявление в sql к linq - PullRequest
28 голосов
/ 24 января 2009

Что такое linq эквивалент следующего утверждения?

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

также можете ли вы предложить какие-либо конвертеры sql-to-linq? В настоящее время я использую LINQPad, который отлично справляется с написанием кода linq, где вы также можете увидеть сгенерированный код sql, однако, когда я нажимаю маленький знак linq, ничего не отображается.

Ответы [ 3 ]

42 голосов
/ 24 января 2009

Это невозможно сделать в LINQ2SQL одним оператором, поскольку синтаксис и методы расширения LINQ не поддерживают вставки. Следующее (при условии, что текстовый текст с именем db) должно сработать.

 if (!db.Users.Any( u => u.UserName == "michael" ))
 {
      db.Users.InsertOnSubmit( new User { UserName = "michael" } );
      db.SubmitChanges();
 }
6 голосов
/ 03 февраля 2010

Метод расширения, который реализует решение 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();
  }

Тогда будет использован метод расширения:

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

Хотя комбинация .Where (). Any () работает достаточно, она, безусловно, помогает логическому потоку представления кода.

2 голосов
/ 30 сентября 2010

Поместите код Exists в статический класс. например добавить класс в ваш проект с чем-то вроде:

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();
        }


    }
}

Не забудьте добавить пространство имен этого класса в любой другой класс, использующий его. ; Р

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...