Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit ffe988c

Browse files
committed
More sub expression fixes
1 parent 538747d commit ffe988c

File tree

2 files changed

+175
-3
lines changed

2 files changed

+175
-3
lines changed

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1404,7 +1404,12 @@ protected virtual object VisitMemberAccess(MemberExpression m)
14041404
}
14051405

14061406
if (m.Expression.NodeType == ExpressionType.Parameter || m.Expression.NodeType == ExpressionType.Convert)
1407-
return GetMemberExpression(m);
1407+
{
1408+
var isSubExprAccess = m.Expression is UnaryExpression &&
1409+
((UnaryExpression)m.Expression).Operand is IndexExpression;
1410+
if (!isSubExprAccess)
1411+
return GetMemberExpression(m);
1412+
}
14081413
}
14091414

14101415
return CachedExpressionCompiler.Evaluate(m);

tests/ServiceStack.OrmLite.Tests/Issues/SqlExpressionSubSqlExpressionIssue.cs

Lines changed: 169 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public void Can_compare_null_constant_in_subquery_nested_in_SqlExpression()
6161
{
6262
RecreateAnyObjectTables(db);
6363

64-
var q = db.From<AnyObjectClass>().Where(x => Sql.In(x.Identity,
64+
var q = db.From<AnyObjectClass>().Where(x => Sql.In(x.Identity,
6565
db.From<AnyObjectClass>()
6666
.Where(y => y.Identity != null)
6767
.Select(y => y.Identity.Value)));
@@ -162,10 +162,177 @@ public void Can_select_sub_expression_when_called_within_a_datamodel()
162162
var model = new AnyObjectClass { db = db };
163163
var result = model.CustomProperty;
164164

165-
db.GetLastSql().Print();
165+
result.PrintDump();
166+
db.GetLastSql().PrintDump();
167+
Assert.That(db.GetLastSql().NormalizeSql(), Is.StringContaining("is null"));
168+
169+
model = new AnyObjectClass { db = db, Identity = Guid.Parse("104ECE6A-7117-4205-961C-126AD276565C") };
170+
result = model.CustomProperty;
166171

167172
result.PrintDump();
173+
db.GetLastSql().PrintDump();
174+
Assert.That(db.GetLastSql().NormalizeSql(), Is.StringContaining("@"));
175+
}
176+
}
177+
178+
[Test]
179+
public void SubExpressions2()
180+
{
181+
int orderTypeId = 2;
182+
using (var db = OpenDbConnection())
183+
{
184+
var subExpr = db.From<Order3>()
185+
.Where(y => y.Order2TypeId == orderTypeId)
186+
.Select(y => y.Person2Id);
187+
188+
Assert.That(subExpr.ToSelectStatement().NormalizeSql(), Is.StringContaining("@"));
189+
190+
var expr = db.From<Person2>()
191+
.Where(x => Sql.In(x.Id, subExpr));
192+
193+
Assert.That(subExpr.ToSelectStatement().NormalizeSql(), Is.StringContaining("@"));
168194
}
169195
}
196+
197+
[Test]
198+
public void SubExpressions_TestMethod1()
199+
{
200+
using (var db = OpenDbConnection())
201+
{
202+
var w = new Waybill(db)
203+
{
204+
Identity = Guid.Empty,
205+
Name = "WaybillTest"
206+
};
207+
208+
w.TestMethod1();
209+
}
210+
}
211+
212+
[Test]
213+
public void SubExpressions_TestMethod2()
214+
{
215+
using (var db = OpenDbConnection())
216+
{
217+
var w = new Waybill(db)
218+
{
219+
Identity = Guid.Empty,
220+
Name = "WaybillTest"
221+
};
222+
223+
w.TestMethod2();
224+
}
225+
}
226+
227+
[Test]
228+
public void SubExpressions_TestMethod3()
229+
{
230+
using (var db = OpenDbConnection())
231+
{
232+
var w = new Waybill(db)
233+
{
234+
Identity = Guid.Empty,
235+
Name = "WaybillTest"
236+
};
237+
238+
w.TestMethod3();
239+
}
240+
}
241+
}
242+
243+
public class WaybillItem : BaseObject
244+
{
245+
public string WbItemName { get; set; }
246+
247+
[ForeignKey(typeof(Waybill))]
248+
public Guid WaybillId { get; set; }
249+
250+
[ForeignKey(typeof(MarginItem))]
251+
public Guid? MarginItemId { get; set; }
252+
}
253+
254+
public class MarginItem : BaseObject
255+
{
256+
public string MarginName { get; set; }
257+
}
258+
259+
260+
//-------------------------
261+
public class Person3
262+
{
263+
[AutoIncrement]
264+
public int Id { get; set; }
265+
266+
public string Name { get; set; }
267+
}
268+
269+
public class Order3
270+
{
271+
[AutoIncrement]
272+
public int Id { get; set; }
273+
274+
[References(typeof(Person3))]
275+
public int Person2Id { get; set; }
276+
277+
public DateTime Order2Date { get; set; }
278+
279+
public int Order2TypeId { get; set; }
280+
}
281+
282+
public class BaseObject
283+
{
284+
public Guid? Identity { get; set; }
285+
}
286+
287+
public class Waybill : BaseObject
288+
{
289+
private readonly IDbConnection db;
290+
291+
public string Name { get; set; }
292+
293+
public Waybill(IDbConnection db)
294+
{
295+
this.db = db;
296+
}
297+
298+
public void TestMethod1()
299+
{
300+
var localIdentity = this.Identity;
301+
302+
var q = this.db.From<MarginItem>()
303+
.Where(s => Sql.In(s.Identity,
304+
this.db.From<WaybillItem>()
305+
.Where(b => b.WaybillId == localIdentity)
306+
.Select(b => b.MarginItemId)));
307+
308+
q.ToSelectStatement().PrintDump();
309+
Assert.That(q.ToSelectStatement().NormalizeSql(), Is.StringContaining("@"));
310+
}
311+
312+
public void TestMethod2()
313+
{
314+
var q = db.From<MarginItem>()
315+
.Where(s => Sql.In(s.Identity,
316+
db.From<WaybillItem>()
317+
.Where(b => b.WaybillId == this.Identity)
318+
.Select(b => b.MarginItemId)));
319+
320+
q.ToSelectStatement().PrintDump();
321+
Assert.That(q.ToSelectStatement().NormalizeSql(), Is.StringContaining("@"));
322+
}
323+
324+
public void TestMethod3()
325+
{
326+
var q = db.From<MarginItem>()
327+
.Where(s => Sql.In(s.Identity,
328+
db.From<WaybillItem>()
329+
.LeftJoin<MarginItem>((wi, mi) => wi.MarginItemId == mi.Identity)
330+
.Where(b => b.WaybillId == this.Identity)
331+
.And<MarginItem>(b => b.MarginName == this.Name)
332+
.Select(b => b.MarginItemId)));
333+
334+
q.ToSelectStatement().PrintDump();
335+
Assert.That(q.ToSelectStatement().NormalizeSql(), Is.StringContaining("@"));
336+
}
170337
}
171338
}

0 commit comments

Comments
 (0)