Table of Contents

Class View

Namespace
YndigoBlue.Velocity.Model
Assembly
YndigoBlue.Velocity.dll

Represents a database view - a virtual table defined by a query.

public class View : Table, IEquatable<Table>, IComparable<Table>, IFromItem, IEquatable<View>
Inheritance
View
Implements

Examples

Creating a code-based view programmatically:

using (Manager manager = new Manager(connection))
{
    Schema schema = manager.CreateSchema("my_schema");
    Table ordersTable = schema.CreateTable("orders");
    ordersTable.AddColumn("id", DataType.Integer);
    ordersTable.AddColumn("user_id", DataType.Integer);
    ordersTable.AddColumn("total", DataType.Decimal, precision: 10, scale: 2);
    ordersTable.AddColumn("status", DataType.VarChar, size: 50);
    ordersTable.AddColumn("created_at", DataType.DateTime);

    // Create a view for active orders
    View activeOrdersView = schema.CreateView("active_orders", ViewType.Code);

    Query viewQuery = new Query();
    viewQuery.AddFromItem(ordersTable);
    viewQuery.AddSelectItem(ordersTable["id"]);
    viewQuery.AddSelectItem(ordersTable["user_id"]);
    viewQuery.AddSelectItem(ordersTable["total"]);
    viewQuery.AddSelectItem(ordersTable["created_at"]);
    viewQuery.SetWhereFilter(
        new Filter(new Criterion<string>(ordersTable["status"], "active"))
    );

    activeOrdersView.Query = viewQuery;

    manager.BuildSchema(schema);
}

// SQL: CREATE VIEW active_orders AS
//      SELECT id, user_id, total, created_at
//      FROM orders
//      WHERE status = 'active'

Using a view in queries:

using (Manager manager = new Manager(connection))
{
    manager.LoadSchema("my_schema");
    Schema schema = manager.GetSchema("my_schema");

    // Views can be used like tables
    View activeOrdersView = schema.GetView("active_orders");

    Query query = new Query();
    query.AddFromItem(activeOrdersView);
    query.AddSelectItem(activeOrdersView["user_id"]);
    query.AddSelectItem(new Function(FunctionType.Sum, activeOrdersView["total"]));
    query.AddGroupClause(activeOrdersView["user_id"]);

    Result result = manager.Retrieve(query);
}

// SQL: SELECT user_id, SUM(total)
//      FROM active_orders
//      GROUP BY user_id

Creating a view with JOINs:

Schema schema = manager.CreateSchema("my_schema");
Table usersTable = schema.CreateTable("users");
usersTable.AddColumn("id", DataType.Integer);
usersTable.AddColumn("username", DataType.VarChar, size: 100);

Table ordersTable = schema.CreateTable("orders");
ordersTable.AddColumn("id", DataType.Integer);
ordersTable.AddColumn("user_id", DataType.Integer);
ordersTable.AddColumn("total", DataType.Decimal, precision: 10, scale: 2);

// Create view with JOIN
View userOrdersView = schema.CreateView("user_orders", ViewType.Code);

JoinCondition joinCondition = new JoinCondition(
    ordersTable["user_id"],
    usersTable["id"]
);
Join join = new Join(ordersTable, usersTable, joinCondition, JoinType.Inner);

Query viewQuery = new Query();
viewQuery.AddFromItem(join);
viewQuery.AddSelectItem(usersTable["username"]);
viewQuery.AddSelectItem(ordersTable["total"]);
viewQuery.AddSelectItem(ordersTable["id"]);

userOrdersView.Query = viewQuery;

// SQL: CREATE VIEW user_orders AS
//      SELECT users.username, orders.total, orders.id
//      FROM orders
//      INNER JOIN users ON orders.user_id = users.id

Loading SQL views from database:

using (Manager manager = new Manager(connection))
{
    // LoadSchema loads existing views as SQL type
    manager.LoadSchema("my_schema");
    Schema schema = manager.GetSchema("my_schema");

    foreach (View view in schema.Views)
    {
        Console.WriteLine($"View: {view.Name}");
        Console.WriteLine($"Type: {view.ViewType}"); // ViewType.Sql
        Console.WriteLine($"SQL: {view.Sql}");

        // SQL views contain the database-specific view definition
        // Code views contain null for Sql property
    }
}

Remarks

Views are saved queries that can be used like tables in other queries. Velocity supports two types of views:

  • Code Views Defined using Velocity's Query objects. Portable across all database types. Created programmatically or loaded from XML/JSON/YAML schema files with ViewType.Code.
  • SQL Views Defined using raw SQL text. Database-specific and not portable. Created when loading schemas from databases using LoadSchema(string).

Views inherit from Table and can be used in the FROM clause of queries. When you set a view's Query property, the view automatically creates columns matching the query's SELECT items.

Constructors

View(string, string, ViewType)

Creates a new view with the specified name, schema, and type.

Properties

Code

Gets or sets the code representation of the view (for future use).

Query

Gets or sets the query that defines this view.

Sql

Gets or sets the raw SQL definition of the view (for SQL-type views only).

ViewType

Gets the type of this view (Code or Sql).

Methods

Equals(View)

Indicates whether the current object is equal to another object of the same type.

ValidateColumnDataType(string, DataType)