diff --git a/src/Umbraco.Core/Persistence/PetaPoco.cs b/src/Umbraco.Core/Persistence/PetaPoco.cs
index 4692cb4b51..735691f6d6 100644
--- a/src/Umbraco.Core/Persistence/PetaPoco.cs
+++ b/src/Umbraco.Core/Persistence/PetaPoco.cs
@@ -2494,9 +2494,9 @@ namespace Umbraco.Core.Persistence
// Now do rhs
if (_rhs != null)
_rhs.Build(sb, args, this);
- }
+ }
- public Sql Where(string sql, params object[] args)
+ public Sql Where(string sql, params object[] args)
{
return Append(new Sql("WHERE (" + sql + ")", args));
}
@@ -2509,9 +2509,14 @@ namespace Umbraco.Core.Persistence
public Sql Select(params object[] columns)
{
return Append(new Sql("SELECT " + String.Join(", ", (from x in columns select x.ToString()).ToArray())));
- }
+ }
- public Sql From(params object[] tables)
+ public Sql AndSelect(params object[] columns)
+ {
+ return Append(new Sql(", " + String.Join(", ", (from x in columns select x.ToString()).ToArray())));
+ }
+
+ public Sql From(params object[] tables)
{
return Append(new Sql("FROM " + String.Join(", ", (from x in tables select x.ToString()).ToArray())));
}
diff --git a/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs
index 090410782a..7b383f85d1 100644
--- a/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs
+++ b/src/Umbraco.Core/Persistence/PetaPocoSqlExtensions.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections;
-using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
@@ -15,6 +14,57 @@ namespace Umbraco.Core.Persistence
///
public static class PetaPocoSqlExtensions
{
+ ///
+ /// Defines the column to select in the generated SQL query
+ ///
+ ///
+ /// Sql object
+ /// Columns to select
+ ///
+ [Obsolete("Use the overload specifying ISqlSyntaxProvider instead")]
+ public static Sql Select(this Sql sql, params Expression>[] fields)
+ {
+ return sql.Select(GetColumnsList(SqlSyntaxContext.SqlSyntaxProvider, fields));
+ }
+
+ ///
+ /// Defines the column to select in the generated SQL query
+ ///
+ ///
+ /// Sql object
+ /// Sql syntax
+ /// Columns to select
+ ///
+ public static Sql Select(this Sql sql, ISqlSyntaxProvider sqlSyntax, params Expression>[] fields)
+ {
+ return sql.Select(GetColumnsList(sqlSyntax, fields));
+ }
+
+ ///
+ /// Adds another set of field to select. This method must be used with "Select" when fecthing fields from different tables.
+ ///
+ ///
+ /// Sql object
+ /// Additional columns to select
+ ///
+ public static Sql AndSelect(this Sql sql, params Expression>[] fields)
+ {
+ return sql.AndSelect(GetColumnsList(SqlSyntaxContext.SqlSyntaxProvider, fields));
+ }
+
+ ///
+ /// Adds another set of field to select. This method must be used with "Select" when fecthing fields from different tables.
+ ///
+ ///
+ /// Sql object
+ /// Sql syntax
+ /// Additional columns to select
+ ///
+ public static Sql AndSelect(this Sql sql, ISqlSyntaxProvider sqlSyntax, params Expression>[] fields)
+ {
+ return sql.AndSelect(GetColumnsList(sqlSyntax, fields));
+ }
+
[Obsolete("Use the overload specifying ISqlSyntaxProvider instead")]
public static Sql From(this Sql sql)
{
@@ -239,5 +289,23 @@ namespace Umbraco.Core.Persistence
var attr = column.FirstAttribute();
return attr == null || string.IsNullOrWhiteSpace(attr.Name) ? column.Name : attr.Name;
}
+
+ private static string[] GetColumnsList(ISqlSyntaxProvider sqlSyntax, params Expression>[] fields)
+ {
+ string tableName = sqlSyntax.GetQuotedTableName(GetTableName(typeof(T)));
+
+ if (fields.Length == 0)
+ {
+ return new[] { string.Format("{0}.*", tableName) };
+ }
+
+ return fields.Select(field =>
+ {
+ var column = ExpressionHelper.FindProperty(field) as PropertyInfo;
+ var columnName = GetColumnName(column);
+
+ return string.Format("{0}.{1}", tableName, sqlSyntax.GetQuotedColumnName(columnName));
+ }).ToArray();
+ }
}
-}
\ No newline at end of file
+}
diff --git a/src/Umbraco.Tests/Persistence/Querying/PetaPocoSqlTests.cs b/src/Umbraco.Tests/Persistence/Querying/PetaPocoSqlTests.cs
index 39f3f484d0..25f0946257 100644
--- a/src/Umbraco.Tests/Persistence/Querying/PetaPocoSqlTests.cs
+++ b/src/Umbraco.Tests/Persistence/Querying/PetaPocoSqlTests.cs
@@ -9,6 +9,7 @@ using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Tests.TestHelpers;
using Umbraco.Core.Persistence.Querying;
+using Umbraco.Core.Persistence.SqlSyntax;
namespace Umbraco.Tests.Persistence.Querying
{
@@ -25,13 +26,13 @@ namespace Umbraco.Tests.Persistence.Querying
Assert.AreEqual("SELECT * FROM [umbracoNode] WHERE (upper([umbracoNode].[path]) LIKE upper(@0))", sql.SQL.Replace("\n", " "));
Assert.AreEqual(1, sql.Arguments.Length);
- Assert.AreEqual(content.Path + "%", sql.Arguments[0]);
+ Assert.AreEqual(content.Path + "%", sql.Arguments[0]);
}
[Test]
public void Where_Clause_With_Starts_With_By_Variable()
{
- var content = new NodeDto() {NodeId = 123, Path = "-1,123"};
+ var content = new NodeDto() { NodeId = 123, Path = "-1,123" };
var sql = new Sql("SELECT *").From().Where(x => x.Path.StartsWith(content.Path) && x.NodeId != content.NodeId);
Assert.AreEqual("SELECT * FROM [umbracoNode] WHERE ((upper([umbracoNode].[path]) LIKE upper(@0) AND ([umbracoNode].[id] <> @1)))", sql.SQL.Replace("\n", " "));
@@ -260,5 +261,74 @@ namespace Umbraco.Tests.Persistence.Querying
Debug.Print(sql.SQL);
}
+
+ [Test]
+ public void Can_Use_Select_With_Star_And_Predicate()
+ {
+ var expected = new Sql();
+ expected.Select("[cmsContent].*")
+ .From("[cmsContent]");
+
+ var sql = new Sql();
+ sql.Select()
+ .From();
+
+ Assert.That(sql.SQL, Is.EqualTo(expected.SQL));
+
+ Debug.Print(sql.SQL);
+ }
+
+ [Test]
+ public void Can_Use_Select_With_One_Column_And_Predicate()
+ {
+ var expected = new Sql();
+ expected.Select("[cmsContent].[nodeId]")
+ .From("[cmsContent]");
+
+ var sql = new Sql();
+ sql.Select(c => c.NodeId)
+ .From();
+
+ Assert.That(sql.SQL, Is.EqualTo(expected.SQL));
+
+ Debug.Print(sql.SQL);
+ }
+
+ [Test]
+ public void Can_Use_Select_With_Multiple_Column_And_Predicate()
+ {
+ var expected = new Sql();
+ expected.Select("[cmsContent].[nodeId]", "[cmsContent].[contentType]", "[cmsContent].[pk]")
+ .From("[cmsContent]");
+
+ var sql = new Sql();
+ sql.Select(c => c.NodeId, c => c.ContentTypeId, c => c.PrimaryKey)
+ .From();
+
+ Assert.That(sql.SQL, Is.EqualTo(expected.SQL));
+
+ Debug.Print(sql.SQL);
+ }
+
+ [Test]
+ public void Can_InnerJoin_With_Select_And_AndSelect()
+ {
+ var expected = new Sql();
+ expected.Select("[cmsDocument].[nodeId], [cmsDocument].[published]\n, [cmsContentVersion].[id]")
+ .From("[cmsDocument]")
+ .InnerJoin("[cmsContentVersion]")
+ .On("[cmsDocument].[versionId] = [cmsContentVersion].[VersionId]");
+
+ var sql = new Sql();
+ sql.Select(d => d.NodeId, d => d.Published)
+ .AndSelect(cv => cv.Id)
+ .From()
+ .InnerJoin()
+ .On(left => left.VersionId, right => right.VersionId);
+
+ Assert.That(sql.SQL, Is.EqualTo(expected.SQL));
+
+ Debug.Print(sql.SQL);
+ }
}
-}
\ No newline at end of file
+}
diff --git a/src/Umbraco.Web.UI.Client/vwd.webinfo b/src/Umbraco.Web.UI.Client/vwd.webinfo
new file mode 100644
index 0000000000..44d783b1df
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/vwd.webinfo
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file