Skip to content

Commit d238971

Browse files
Adding support for other expression types for DateFunctions
1 parent 29625a6 commit d238971

3 files changed

Lines changed: 59 additions & 33 deletions

File tree

FluentSql.Tests/SelectStatement/SelectStatementTest.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,24 @@ public void WhereClauseWithGetDatePartDayOfYear()
794794
Xunit.Assert.NotNull(singleEmployee);
795795
}
796796

797+
[Fact]
798+
public void WhereClauseWithGetDatePartDayOfYear1()
799+
{
800+
var store = new EntityStore(_dbConnection);
801+
var order = store.GetSingle<Order>(o => SqlFunctions.GetDayOfYear(o.OrderDate) <= DateTime.Now.DayOfYear);
802+
803+
Xunit.Assert.NotNull(order);
804+
}
805+
806+
[Fact]
807+
public void WhereClauseWithGetDatePartDayOfYear2()
808+
{
809+
var store = new EntityStore(_dbConnection);
810+
var order = store.GetSingle<Order>(o => SqlFunctions.GetDayOfYear(DateTime.Now) >= SqlFunctions.GetDayOfYear(o.OrderDate));
811+
812+
Xunit.Assert.NotNull(order);
813+
}
814+
797815
[Fact]
798816
public void WhereClauseWithGetDatePartDay()
799817
{
@@ -878,15 +896,6 @@ public void WhereClauseWithGetDayDiff()
878896
Xunit.Assert.IsType<Order>(otherOrder);
879897
}
880898

881-
[Fact]
882-
public void WhereClauseWithGetDatePartDayOfYear1()
883-
{
884-
var store = new EntityStore(_dbConnection);
885-
var order = store.GetSingle<Order>(o => SqlFunctions.GetDayOfYear(o.OrderDate) >= DateTime.Now.Day);
886-
887-
Xunit.Assert.NotNull(order);
888-
}
889-
890899
public void Dispose()
891900
{
892901
_dbConnection.Close();

FluentSql/SqlGenerators/SqlServer/SqlServerSqlGenerator.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,10 @@ public string GetStringComparisonOperator()
181181
public string GetDateDiffFunction(Type minuendType, string minuend, Type subtrahendType, string subtrahend)
182182
{
183183
if (minuendType == null || string.IsNullOrEmpty(minuend))
184-
throw new ArgumentNullException("entityTypeMinuend cannot be null");
184+
throw new ArgumentNullException("minuendType cannot be null");
185185

186186
if (subtrahendType == null || string.IsNullOrEmpty(subtrahend))
187-
throw new ArgumentNullException("entityTypeMinuend cannot be null");
187+
throw new ArgumentNullException("subtrahendType cannot be null");
188188

189189
var datediffFunction = "DATEDIFF({0}, {1}, {2})";
190190
var formattedMinuend = GetDateDiffField(minuendType, minuend);
@@ -301,7 +301,7 @@ private string GetDateDiffField(Type operandType, string operandName)
301301
{
302302
if (operandType == null) return null;
303303

304-
if (operandType == typeof(DateTime?)) return operandName;
304+
if (operandType == typeof(DateTime?) || operandType == typeof(DateTime)) return operandName;
305305

306306
var verifiedField = EntityMapper.Entities[operandType].Properties
307307
.FirstOrDefault(p => p.Name == operandName);

FluentSql/Support/Helpers/ExpressionHelper.cs

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,20 @@ protected override Expression VisitMember(MemberExpression memberExpression)
204204
_predicateString.Push(memberExpression.ToString() + " = 1");
205205
}
206206
else if (member.MemberType == MemberTypes.Property &&
207-
propertyType == typeof(System.DateTime) &&
207+
(propertyType == typeof(System.DateTime) ||
208+
(propertyType == typeof(DateTime?))) &&
208209
memberExpression.Expression == null)
209210
{
210211
AddToPredicate(memberExpression);
212+
return memberExpression;
213+
}
214+
else if (member.MemberType == MemberTypes.Property &&
215+
propertyType == typeof(Int32) &&
216+
memberExpression.Expression != null &&
217+
memberExpression.ToString().StartsWith("DateTime.Now."))
218+
{
219+
AddToPredicate(memberExpression);
220+
return memberExpression;
211221
}
212222
else if (memberExpression.Expression != null &&
213223
memberExpression.Expression.NodeType == ExpressionType.MemberAccess &&
@@ -496,15 +506,12 @@ private MethodCallExpression ParseSqlFunctions(MethodCallExpression methodCall)
496506
if (methodCall.Arguments.Count < 1)
497507
throw new Exception(string.Format("Method not implemented: {0}", methodName ?? "Undetermined method name."));
498508

499-
var fieldTypeExpression = methodCall.Arguments[0];
500-
var memberExpression = (MemberExpression)fieldTypeExpression;
509+
Type operandType = null;
510+
string operand = string.Empty;
501511

502-
if (fieldTypeExpression == null || memberExpression.Expression == null)
503-
throw new ArgumentException(string.Format("Method {0} expects a field type as parameter.", methodName));
512+
GetDateOperands(methodCall, 0, ref operandType, ref operand);
504513

505-
var entityType = memberExpression.Expression.Type;
506-
var propertyName = GetPropertyName(fieldTypeExpression.ToString());
507-
var datePartFuntion = EntityMapper.SqlGenerator.GetDatePartFunction(methodName, entityType, propertyName);
514+
var datePartFuntion = EntityMapper.SqlGenerator.GetDatePartFunction(methodName, operandType, operand);
508515

509516
_predicateString.Push(datePartFuntion);
510517
}
@@ -536,28 +543,40 @@ private void ResolveDateDiffFunction(MethodCallExpression methodCall)
536543
Type minuendType = null;
537544
Type subtrahendType = null;
538545

539-
GetDateDiffOperands(methodCall, 0, ref minuendType, ref minuend);
540-
GetDateDiffOperands(methodCall, 1, ref subtrahendType, ref subtrahend);
546+
GetDateOperands(methodCall, 0, ref minuendType, ref minuend);
547+
GetDateOperands(methodCall, 1, ref subtrahendType, ref subtrahend);
548+
549+
if (minuendType == typeof(DateTime) || minuendType == typeof(DateTime?))
550+
{
551+
var paramName = _paramNameGenerator.GetNextParameterName(_parameterName);
552+
553+
QueryParameters.Add(paramName, minuend);
554+
minuend = paramName;
555+
}
556+
557+
if (subtrahendType == typeof(DateTime) || subtrahendType == typeof(DateTime?))
558+
{
559+
var paramName = _paramNameGenerator.GetNextParameterName(_parameterName);
560+
561+
QueryParameters.Add(paramName, subtrahend);
562+
subtrahend = paramName;
563+
}
541564

542565
var dateDiffFunction = EntityMapper.SqlGenerator.GetDateDiffFunction(minuendType, minuend, subtrahendType, subtrahend);
543566

544567
_predicateString.Push(dateDiffFunction);
545-
546568
}
547569

548-
private void GetDateDiffOperands(MethodCallExpression methodCall, int argOrdinalPosition, ref Type operandType, ref string operand)
570+
private void GetDateOperands(MethodCallExpression methodCall, int argOrdinalPosition, ref Type operandType, ref string operand)
549571
{
550572
Expression fieldTypeExpression = methodCall.Arguments[argOrdinalPosition];
551573

552574
if (fieldTypeExpression.NodeType == ExpressionType.Convert)
553575
{
554576
var operandValue = GetDateTimeValue(fieldTypeExpression);
555-
var paramName = _paramNameGenerator.GetNextParameterName(_parameterName);
556577

557578
operandType = typeof(DateTime?);
558-
operand = paramName;
559-
560-
QueryParameters.Add(paramName, operandValue);
579+
operand = operandValue.HasValue ? operandValue.Value.ToString() : "";
561580

562581
}
563582
else if (fieldTypeExpression.NodeType == ExpressionType.MemberAccess &&
@@ -566,16 +585,14 @@ private void GetDateDiffOperands(MethodCallExpression methodCall, int argOrdinal
566585
{
567586
var memberExp = (MemberExpression)fieldTypeExpression;
568587

569-
operandType = memberExp.Type;
588+
operandType = memberExp.Expression == null ? null : memberExp.Expression.Type;
570589
operand = GetPropertyName(memberExp.ToString());
571590
}
572591
else
573592
{
574-
var paramName = _paramNameGenerator.GetNextParameterName(_parameterName);
575-
var operandValue = GetValue((MemberExpression)fieldTypeExpression).ToString();
593+
var operandValue = GetValue((MemberExpression)fieldTypeExpression);
576594

577-
QueryParameters.Add(paramName, operandValue);
578-
operand = paramName;
595+
operand = operandValue.ToString();
579596
operandType = typeof(DateTime?);
580597
}
581598
}

0 commit comments

Comments
 (0)