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

Commit

Permalink
Add fix for expression with column reference on joined table
Browse files Browse the repository at this point in the history
  • Loading branch information
mythz committed Oct 17, 2014
1 parent 6042c54 commit d018bd3
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 2 deletions.
5 changes: 5 additions & 0 deletions src/ServiceStack.OrmLite/Expressions/SqlExpression.Join.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ public abstract partial class SqlExpression<T> : ISqlExpression
{
List<ModelDefinition> tableDefs = new List<ModelDefinition>();

bool IsJoinedTable(Type type)
{
return tableDefs.FirstOrDefault(x => x.ModelType == type) != null;
}

public SqlExpression<T> Join<Target>(Expression<Func<T, Target, bool>> joinExpr = null)
{
return InternalJoin("INNER JOIN", joinExpr);
Expand Down
4 changes: 2 additions & 2 deletions src/ServiceStack.OrmLite/Expressions/SqlExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1095,11 +1095,11 @@ private bool IsColumnAccess(MethodCallExpression m)
{
if (m.Object != null && m.Object as MethodCallExpression != null)
return IsColumnAccess(m.Object as MethodCallExpression);

var exp = m.Object as MemberExpression;
return exp != null
&& exp.Expression != null
&& exp.Expression.Type == typeof(T)
&& IsJoinedTable(exp.Expression.Type)
&& exp.Expression.NodeType == ExpressionType.Parameter;
}

Expand Down
23 changes: 23 additions & 0 deletions tests/ServiceStack.OrmLite.Tests/Expression/ComplexJoinTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,29 @@ private static void InitTables(IDbConnection db)
db.Insert(new FooBarBaz { Amount = 2, FooBarId = 2, BazId = 1 });
}

[Test]
public void Can_query_contains_on_joined_table_column()
{
using (var db = OpenDbConnection())
{
InitTables(db);

var q = db.From<FooBar>()
.Join<BarJoin>((dp, p) => dp.BarId == p.Id)
.Where<BarJoin>(x => x.Name.Contains("an"));

var results = db.Select<JoinResult>(q);
Assert.That(results.Count, Is.EqualTo(2));

q = db.From<FooBar>()
.Join<BarJoin>((dp, p) => dp.BarId == p.Id)
.Where<FooBar, BarJoin>((f,x) => x.Name.Contains("an"));

results = db.Select<JoinResult>(q);
Assert.That(results.Count, Is.EqualTo(2));
}
}

[Test]
public void ComplexJoin_with_JoinSqlBuilder()
{
Expand Down

0 comments on commit d018bd3

Please sign in to comment.