Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 32 additions & 18 deletions src/NServiceKit.OrmLite/Expressions/SqlExpressionVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public abstract class SqlExpressionVisitor<T>
private Expression<Func<T, bool>> underlyingExpression;

/// <summary>The order by properties.</summary>
private List<string> orderByProperties = new List<string>();
private List<string> orderByProperties = new List<string>();

/// <summary>The select expression.</summary>
private string selectExpression = string.Empty;
Expand Down Expand Up @@ -54,7 +54,7 @@ public abstract class SqlExpressionVisitor<T>
/// Gets or sets a value indicating whether the prefix field with table name.
/// </summary>
/// <value>true if prefix field with table name, false if not.</value>
public bool PrefixFieldWithTableName {get;set;}
public bool PrefixFieldWithTableName { get; set; }

/// <summary>
/// Gets or sets a value indicating whether the where statement without where string.
Expand Down Expand Up @@ -300,7 +300,7 @@ public virtual SqlExpressionVisitor<T> OrderBy<TKey>(Expression<Func<T, TKey>> k
sep = string.Empty;
useFieldName = true;
orderByProperties.Clear();
var property = Visit(keySelector).ToString();
var property = Visit(keySelector).ToString();
orderByProperties.Add(property + " ASC");
BuildOrderByClauseInternal();
return this;
Expand All @@ -310,7 +310,7 @@ public virtual SqlExpressionVisitor<T> OrderBy<TKey>(Expression<Func<T, TKey>> k
/// <typeparam name="TKey">Type of the key.</typeparam>
/// <param name="keySelector">The key selector.</param>
/// <returns>A SqlExpressionVisitor&lt;T&gt;</returns>
public virtual SqlExpressionVisitor<T> ThenBy<TKey> (Expression<Func<T,TKey>> keySelector)
public virtual SqlExpressionVisitor<T> ThenBy<TKey>(Expression<Func<T, TKey>> keySelector)
{
sep = string.Empty;
useFieldName = true;
Expand Down Expand Up @@ -355,7 +355,7 @@ private void BuildOrderByClauseInternal()
if (orderByProperties.Count > 0)
{
orderBy = "ORDER BY ";
foreach(var prop in orderByProperties)
foreach (var prop in orderByProperties)
{
orderBy += prop + ",";
}
Expand Down Expand Up @@ -773,7 +773,7 @@ protected virtual object VisitBinary(BinaryExpression b)
if (operand == "AND" || operand == "OR")
{
var m = b.Left as MemberExpression;
if (m != null && m.Expression != null
if (m != null && m.Expression != null
&& m.Expression.NodeType == ExpressionType.Parameter)
left = new PartialSqlString(string.Format("{0}={1}", VisitMemberAccess(m), GetQuotedTrueValue()));
else
Expand All @@ -792,8 +792,8 @@ protected virtual object VisitBinary(BinaryExpression b)
return new PartialSqlString(OrmLiteConfig.DialectProvider.GetQuotedValue(result, result.GetType()));
}

if(left as PartialSqlString == null)
left = ((bool) left) ? GetTrueExpression() : GetFalseExpression();
if (left as PartialSqlString == null)
left = ((bool)left) ? GetTrueExpression() : GetFalseExpression();
if (right as PartialSqlString == null)
right = ((bool)right) ? GetTrueExpression() : GetFalseExpression();
}
Expand Down Expand Up @@ -835,7 +835,7 @@ protected virtual object VisitBinary(BinaryExpression b)
left = OrmLiteConfig.DialectProvider.GetQuotedValue(left, left != null ? left.GetType() : null);
else if (right as PartialSqlString == null)
right = OrmLiteConfig.DialectProvider.GetQuotedValue(right, right != null ? right.GetType() : null);

}

if (operand == "=" && right.ToString().Equals("null", StringComparison.InvariantCultureIgnoreCase)) operand = "is";
Expand All @@ -847,7 +847,7 @@ protected virtual object VisitBinary(BinaryExpression b)
case "COALESCE":
return new PartialSqlString(string.Format("{0}({1},{2})", operand, left, right));
default:
return new PartialSqlString("(" + left + sep + operand + sep + right +")");
return new PartialSqlString("(" + left + sep + operand + sep + right + ")");
}
}

Expand All @@ -864,7 +864,7 @@ protected virtual object VisitMemberAccess(MemberExpression m)
if (propertyInfo.PropertyType.IsEnum)
return new EnumMemberAccess((PrefixFieldWithTableName ? OrmLiteConfig.DialectProvider.GetQuotedTableName(modelDef.ModelName) + "." : "") + GetQuotedColumnName(m.Member.Name), propertyInfo.PropertyType);

return new PartialSqlString((PrefixFieldWithTableName ? OrmLiteConfig.DialectProvider.GetQuotedTableName(modelDef.ModelName)+"." : "") + GetQuotedColumnName(m.Member.Name));
return new PartialSqlString((PrefixFieldWithTableName ? OrmLiteConfig.DialectProvider.GetQuotedTableName(modelDef.ModelName) + "." : "") + GetQuotedColumnName(m.Member.Name));
}

var member = Expression.Convert(m, typeof(object));
Expand Down Expand Up @@ -961,7 +961,7 @@ protected virtual object VisitUnary(UnaryExpression u)
return !((bool)o);

if (IsFieldName(o))
o = o + "=" + GetQuotedTrueValue();
o = o + "=" + GetQuotedTrueValue();

return new PartialSqlString("NOT (" + o + ")");
case ExpressionType.Convert:
Expand All @@ -983,8 +983,8 @@ private bool IsColumnAccess(MethodCallExpression m)
return IsColumnAccess(m.Object as MethodCallExpression);

var exp = m.Object as MemberExpression;
return exp != null
&& exp.Expression != null
return exp != null
&& exp.Expression != null
&& exp.Expression.Type == typeof(T)
&& exp.Expression.NodeType == ExpressionType.Parameter;
}
Expand All @@ -997,7 +997,7 @@ protected virtual object VisitMethodCall(MethodCallExpression m)
if (m.Method.DeclaringType == typeof(Sql))
return VisitSqlMethodCall(m);

if (IsArrayMethod(m))
if (IsArrayMethod(m))
return VisitArrayMethodCall(m);

if (IsColumnAccess(m))
Expand Down Expand Up @@ -1159,7 +1159,7 @@ protected object GetFalseExpression()
/// <returns>The quoted true value.</returns>
protected static object GetQuotedTrueValue()
{
return new PartialSqlString(OrmLiteConfig.DialectProvider.GetQuotedValue(true, typeof (bool)));
return new PartialSqlString(OrmLiteConfig.DialectProvider.GetQuotedValue(true, typeof(bool)));
}

/// <summary>Gets quoted false value.</summary>
Expand Down Expand Up @@ -1195,7 +1195,7 @@ public IList<string> GetAllFields()
/// <returns>A string.</returns>
protected virtual string ApplyPaging(string sql)
{
sql = sql + (string.IsNullOrEmpty(LimitExpression) ? "" :"\n" + LimitExpression);
sql = sql + (string.IsNullOrEmpty(LimitExpression) ? "" : "\n" + LimitExpression);
return sql;
}

Expand Down Expand Up @@ -1390,6 +1390,19 @@ protected virtual object VisitColumnAccessMethod(MethodCallExpression m)
}
return new PartialSqlString(statement);
}

public string ToInsertWhereNotExistsStatement(object obj)
{
var sql = new StringBuilder();
var fieldDefs = modelDef.FieldDefinitions.Where(t => t.AutoIncrement == false && t.IsComputed == false).ToList();
sql.AppendFormat("Insert Into {0} ({1})", OrmLiteConfig.DialectProvider.GetQuotedTableName(modelDef), string.Join(",", fieldDefs.Select(t => OrmLiteConfig.DialectProvider.GetQuotedColumnName(t.FieldName)).ToArray()));
sql.Append("\n");
sql.AppendFormat("Select {0}", string.Join(",", fieldDefs.Select(t => t.GetQuotedValue(obj)).ToArray()));
sql.Append("\n");
BuildSelectExpression("1", false);
sql.AppendFormat(" where not exists({0} {1})", selectExpression, WhereExpression);
return sql.ToString();
}
}

/// <summary>A partial SQL string.</summary>
Expand Down Expand Up @@ -1431,7 +1444,8 @@ public class EnumMemberAccess : PartialSqlString
/// illegal values.</exception>
/// <param name="text"> The text.</param>
/// <param name="enumType">The type of the enum.</param>
public EnumMemberAccess(string text, Type enumType) : base(text)
public EnumMemberAccess(string text, Type enumType)
: base(text)
{
if (!enumType.IsEnum) throw new ArgumentException("Type not valid", "enumType");

Expand Down
13 changes: 13 additions & 0 deletions src/NServiceKit.OrmLite/OrmLiteWriteConnectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;

namespace NServiceKit.OrmLite
{
Expand Down Expand Up @@ -297,6 +298,18 @@ public static void Insert<T>(this IDbConnection dbConn, params T[] objs)
dbConn.Exec(dbCmd => dbCmd.Insert(objs));
}


/// <summary>An IDbConnection extension method that inserts where not exists.</summary>
/// <typeparam name="T">Generic type parameter.</typeparam>
/// <param name="dbConn">The dbConn to act on.</param>
/// <param name="obj"> The object.</param>
/// <param name="wherePredicate"> predicate to create where clause</param>
public static void InsertWhereNotExists<T>(this IDbConnection dbConn, T obj, Expression<Func<T, bool>> wherePredicate)
where T : new()
{
dbConn.Exec(dbCmd => dbCmd.InsertWhereNotExists(obj,wherePredicate));
}

/// <summary>An IDbConnection extension method that inserts all.</summary>
/// <typeparam name="T">Generic type parameter.</typeparam>
/// <param name="dbConn">The dbConn to act on.</param>
Expand Down
Loading