Skip to content

Commit a43dc4c

Browse files
author
Jeff Treuting
committed
Fixed some querying
Works for StartsWith, EndsWith, ToUpper, ToLower and Length
1 parent a57858c commit a43dc4c

2 files changed

Lines changed: 51 additions & 27 deletions

File tree

SharpRepository.ODataRepository/Linq/QueryGeneration/ODataApiGeneratorExpressionTreeVisitor.cs

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ protected override Expression VisitBinaryExpression (BinaryExpression expression
8787
break;
8888

8989
case ExpressionType.Subtract:
90-
_expression.Append (" aub ");
90+
_expression.Append (" sub ");
9191
break;
9292

9393
case ExpressionType.Multiply:
@@ -116,8 +116,18 @@ protected override Expression VisitBinaryExpression (BinaryExpression expression
116116

117117
protected override Expression VisitMemberExpression (MemberExpression expression)
118118
{
119-
VisitExpression (expression.Expression);
120-
_expression.AppendFormat("{0}", expression.Member.Name);
119+
// this seems sort of hacky
120+
// it is not recognizing Length as a method but as a Member, so let's specifically deal with it here I guess
121+
if (expression.Member.Name == "Length")
122+
{
123+
var parts = ((MemberExpression)expression.Expression).Member.Name.Split('.');
124+
_expression.AppendFormat("length({0})", parts[parts.Length-1]);
125+
}
126+
else
127+
{
128+
VisitExpression(expression.Expression);
129+
_expression.AppendFormat("{0}", expression.Member.Name);
130+
}
121131

122132
return expression;
123133
}
@@ -178,7 +188,7 @@ protected override Expression VisitNewExpression(NewExpression expression)
178188

179189
return expression;
180190

181-
return base.VisitNewExpression(expression);
191+
//return base.VisitNewExpression(expression);
182192
}
183193

184194
protected override Expression VisitMethodCallExpression (MethodCallExpression expression)
@@ -187,45 +197,46 @@ protected override Expression VisitMethodCallExpression (MethodCallExpression ex
187197

188198
if (expression.Method.Name == "Contains")
189199
{
190-
_expression.Append(String.Format("substringof('{1}',{0}) eq true",
191-
VisitExpression(expression.Object),
192-
VisitExpression(expression.Arguments[0])));
200+
_expression.Append("substringof(");
201+
VisitExpression(expression.Arguments[0]);
202+
_expression.Append(",");
203+
VisitExpression(expression.Object);
204+
_expression.Append(") eq true");
193205
return expression;
194206
}
195207

196208
if (expression.Method.Name == "StartsWith")
197209
{
198-
_expression.Append(String.Format("startswith({0},'{1}') eq true",
199-
VisitExpression(expression.Object),
200-
VisitExpression(expression.Arguments[0])));
210+
_expression.Append("startswith(");
211+
VisitExpression(expression.Object);
212+
_expression.Append(",");
213+
VisitExpression(expression.Arguments[0]);
214+
_expression.Append(") eq true");
201215
return expression;
202216
}
203217

204218
if (expression.Method.Name == "EndsWith")
205219
{
206-
_expression.Append(String.Format("endswith({0},'{1}') eq true",
207-
VisitExpression(expression.Object),
208-
VisitExpression(expression.Arguments[0])));
209-
return expression;
210-
}
211-
212-
if (expression.Method.Name == "Length")
213-
{
214-
_expression.Append(String.Format("length({0})",
215-
VisitExpression(expression.Object)));
220+
_expression.Append("endswith(");
221+
VisitExpression(expression.Object);
222+
_expression.Append(",");
223+
VisitExpression(expression.Arguments[0]);
224+
_expression.Append(") eq true");
216225
return expression;
217226
}
218227

219228
if (expression.Method.Name == "ToLower")
220229
{
221-
_expression.Append(String.Format("tolower({0})",
222-
VisitExpression(expression.Object)));
230+
_expression.Append("tolower(");
231+
VisitExpression(expression.Object);
232+
_expression.Append(")");
223233
return expression;
224234
}
225-
if (expression.Method.Name == "ToUper")
235+
if (expression.Method.Name == "ToUpper")
226236
{
227-
_expression.Append(String.Format("touper({0})",
228-
VisitExpression(expression.Object)));
237+
_expression.Append("toupper(");
238+
VisitExpression(expression.Object);
239+
_expression.Append(")");
229240
return expression;
230241
}
231242

SharpRepository.Tests.Integration/Spikes/ODataSpikes.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,23 @@ public void NetflixTest()
2121
public void NetflixFindAllTest()
2222
{
2323
var repository = new ODataRepository<Title>("http://odata.netflix.com/v2/Catalog");
24-
//var results = repository.FindAll(x => x.ReleaseYear == 1991 && x.ShortName.StartsWith("The")); // messes up the query syntax, look into this
25-
var results = repository.FindAll(x => x.ReleaseYear == 1991 && x.ShortName == "Backdraft");
24+
var results = repository.FindAll(x => x.ReleaseYear == 1991 && x.ShortName.StartsWith("The"));
25+
results.Count().ShouldEqual(103);
2626

27+
results = repository.FindAll(x => x.ReleaseYear == 1991 && x.ShortName.EndsWith("draft"));
2728
results.Count().ShouldEqual(1);
29+
30+
results = repository.FindAll(x => x.ReleaseYear == 1991 && x.ShortName == "Backdraft");
31+
results.Count().ShouldEqual(1);
32+
33+
results = repository.FindAll(x => x.ReleaseYear == 1991 && x.ShortName.ToUpper() == "BACKDRAFT");
34+
results.Count().ShouldEqual(1);
35+
36+
results = repository.FindAll(x => x.ReleaseYear == 1991 && x.ShortName.ToLower() == "backdraft");
37+
results.Count().ShouldEqual(1);
38+
39+
results = repository.FindAll(x => x.ReleaseYear == 1991 && x.ShortName.Length == 9);
40+
results.Count().ShouldEqual(27);
2841
}
2942
}
3043

0 commit comments

Comments
 (0)