if exists statement in sql to linq
It can't be done in LINQ2SQL with a single statement as the LINQ syntax and extension methods don't support inserts. The following (assuming a datacontext named db
) should do the trick.
if (!db.Users.Any( u => u.UserName == "michael" )) { db.Users.InsertOnSubmit( new User { UserName = "michael" } ); db.SubmitChanges(); }
Extension method that implements tvanfosson's solution:
/// <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(); }
The extension method would then be used:
bool exists = dataContext.Widgets.Exists(a => a.Name == "Premier Widget");
Although the .Where().Any() combination works sufficiently, it does certainly help the logic flow of the code presentation.
Put the Exists code in a static class. e.g. add a class to your project w/ something like:
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(); } }}
Don't forget to add the namespace of this class to any other class using it. ;P