Skip to content

Commit 19d5d78

Browse files
committed
Fix for issue ThatRendle#184
1 parent 09e979f commit 19d5d78

3 files changed

Lines changed: 40 additions & 4 deletions

File tree

Simple.Data.Ado/ObjectName.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public bool Equals(ObjectName other)
5757
{
5858
if (ReferenceEquals(null, other)) return false;
5959
if (ReferenceEquals(this, other)) return true;
60-
return Equals(other._schema, _schema) && Equals(other._name, _name);
60+
return Equals(other._schema, _schema) && Equals(other._name, _name) && Equals(other._alias, _alias);
6161
}
6262

6363
/// <summary>
@@ -86,7 +86,7 @@ public override int GetHashCode()
8686
{
8787
unchecked
8888
{
89-
return ((_schema??string.Empty).GetHashCode()*397) ^ _name.GetHashCode();
89+
return ((_schema??string.Empty).GetHashCode()*397) ^ (_name.GetHashCode()*397) ^ ((_alias??string.Empty).GetHashCode());
9090
}
9191
}
9292

Simple.Data.Ado/QueryBuilder.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ private void HandleJoins()
223223
var fromHavingCriteria = joiner.GetJoinClauses(_tableName, _havingCriteria);
224224

225225
var fromColumnList = _columns.Any(r => !(r is SpecialReference))
226-
? joiner.GetJoinClauses(_tableName, GetObjectReferences(_columns).Where(o => !joinClauses.Any(j => o.GetOwner().Equals(j.Table))), JoinType.Outer)
226+
? GetJoinClausesFromColumnList(joinClauses, joiner)
227227
: Enumerable.Empty<string>();
228228

229229
var joinList = fromTable.Concat(fromJoins).Concat(fromCriteria).Concat(fromHavingCriteria).Concat(fromColumnList).Select(s => s.Trim()).Distinct().ToList();
@@ -246,6 +246,18 @@ private void HandleJoins()
246246
}
247247
}
248248

249+
private IEnumerable<string> GetJoinClausesFromColumnList(IEnumerable<JoinClause> joinClauses, Joiner joiner)
250+
{
251+
return joiner.GetJoinClauses(_tableName, GetObjectReferences(_columns)
252+
.Where(o => !joinClauses.Any(j => ObjectReferenceIsInJoinClause(j, o))), JoinType.Outer);
253+
254+
}
255+
256+
private static bool ObjectReferenceIsInJoinClause(JoinClause clause, ObjectReference reference)
257+
{
258+
return reference.GetOwner().GetAliasOrName().Equals(clause.Table.GetAliasOrName());
259+
}
260+
249261
private IEnumerable<ObjectReference> GetObjectReferences(IEnumerable<SimpleReference> source)
250262
{
251263
var list = source.ToList();

Simple.Data.BehaviourTest/Query/WithTest.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ public void CriteriaReferencesShouldNotBeDuplicatedInSql()
254254
/// Test for issue #184
255255
/// </summary>
256256
[Test]
257-
public void CriteriaReferencesShouldUseWithAlias()
257+
public void CriteriaReferencesShouldUseWithAliasOutValue()
258258
{
259259
const string expectedSql = "select [dbo].[employee].[id],[dbo].[employee].[name]," +
260260
"[dbo].[employee].[managerid],[dbo].[employee].[departmentid]," +
@@ -272,5 +272,29 @@ public void CriteriaReferencesShouldUseWithAlias()
272272

273273
GeneratedSqlIs(expectedSql);
274274
}
275+
276+
/// <summary>
277+
/// Test for issue #184
278+
/// </summary>
279+
[Test]
280+
public void CriteriaReferencesShouldUseSeparateJoinFromWithAlias()
281+
{
282+
const string expectedSql = "select [dbo].[employee].[id],[dbo].[employee].[name]," +
283+
"[dbo].[employee].[managerid],[dbo].[employee].[departmentid]," +
284+
"[foo].[id] as [__with1__foo__id],[foo].[name] as [__with1__foo__name]" +
285+
" from [dbo].[employee]" +
286+
" join [dbo].[department] on ([dbo].[department].[id] = [dbo].[employee].[departmentid])" +
287+
" left join [dbo].[department] [foo] on ([foo].[id] = [dbo].[employee].[departmentid])" +
288+
" where ([dbo].[employee].[name] like @p1" +
289+
" and [dbo].[department].[name] = @p2)";
290+
291+
var q = _db.Employees.Query()
292+
.Where(_db.Employees.Name.Like("A%"))
293+
.WithOne(_db.Employees.Department.As("Foo"))
294+
.Where(_db.Employees.Department.Name == "Admin");
295+
EatException(() => q.ToList());
296+
297+
GeneratedSqlIs(expectedSql);
298+
}
275299
}
276300
}

0 commit comments

Comments
 (0)