Skip to content

Commit fe411e8

Browse files
committed
Merge branch 'v2' of github.com:markrendle/Simple.Data into v2
2 parents 54db1f6 + 2df0c76 commit fe411e8

File tree

4 files changed

+32
-8
lines changed

4 files changed

+32
-8
lines changed

src/Simple.Data.Ado/AdoAdapterQueryRunner.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -183,13 +183,14 @@ private void ApplyPaging(SimpleQuery query, List<ICommandBuilder> commandBuilder
183183
else
184184
{
185185
var table = _adapter.GetSchema().FindTable(query.TableName);
186-
if (table.PrimaryKey == null || table.PrimaryKey.Length == 0)
186+
var keys = new string[0];
187+
if (table.PrimaryKey != null && table.PrimaryKey.Length > 0)
187188
{
188-
throw new AdoAdapterException(string.Format("Cannot apply paging to table '{0}' with no primary key.", table.ActualName));
189+
keys = table.PrimaryKey.AsEnumerable()
190+
.Select(k => string.Format("{0}.{1}", table.QualifiedName, _adapter.GetSchema().QuoteObjectName(k)))
191+
.ToArray();
189192
}
190-
var keys = table.PrimaryKey.AsEnumerable()
191-
.Select(k => string.Format("{0}.{1}", table.QualifiedName, _adapter.GetSchema().QuoteObjectName(k)))
192-
.ToArray();
193+
193194
int skip = skipClause == null ? 0 : skipClause.Count;
194195
int take = takeClause == null ? maxInt : takeClause.Count;
195196
commandTexts = queryPager.ApplyPaging(mainCommandBuilder.Text, keys, skip, take);

src/Simple.Data.SqlServer/SqlQueryPager.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,13 @@ public IEnumerable<string> ApplyLimit(string sql, int take)
2020
yield return SelectMatch.Replace(sql, match => match.Value + " TOP " + take + " ");
2121
}
2222

23-
public IEnumerable<string> ApplyPaging(string sql, string[] keys, int skip, int take)
24-
{
23+
public IEnumerable<string> ApplyPaging(string sql, string[] keys, int skip, int take)
24+
{
25+
if (keys == null || keys.Length == 0)
26+
{
27+
throw new AdoAdapterException("Cannot apply paging to table with no primary key.");
28+
}
29+
2530
sql = sql.Replace(Environment.NewLine, " ");
2631
var builder = new StringBuilder("WITH __Data AS (SELECT ");
2732

src/Simple.Data.SqlTest/SqlQueryPagerTest.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Text;
55
using System.Text.RegularExpressions;
66
using NUnit.Framework;
7+
using Simple.Data.Ado;
78
using Simple.Data.SqlServer;
89

910
namespace Simple.Data.SqlTest
@@ -112,5 +113,15 @@ public void ShouldExcludeLeftJoinedTablesFromSubSelect()
112113
var modified = Normalize.Replace(pagedSql, " ").ToLowerInvariant();
113114
Assert.AreEqual(expected, modified);
114115
}
116+
117+
[Test]
118+
public void ShouldThrowIfTableHasNoPrimaryKey([Values(null, new string[0])]string[] keys)
119+
{
120+
var sql = "select [dbo].[d].[a] from [dbo].[b]";
121+
122+
Assert.Throws<AdoAdapterException>(
123+
() => new SqlQueryPager().ApplyPaging(sql, keys, 5, 10).ToList()
124+
);
125+
}
115126
}
116127
}

src/Simple.Data/MefHelper.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,14 @@ private static CompositionContainer CreateAppDomainContainer()
9696

9797
private static bool IsSimpleDataAssembly(Assembly assembly)
9898
{
99-
return assembly.GetFullName().StartsWith("Simple.Data.", StringComparison.OrdinalIgnoreCase);
99+
try
100+
{
101+
return assembly.GetFullName().StartsWith("Simple.Data.", StringComparison.OrdinalIgnoreCase);
102+
}
103+
catch
104+
{
105+
return false;
106+
}
100107
}
101108
}
102109
}

0 commit comments

Comments
 (0)