Files
DynamORM/docs/dynamic-table-api.md

2.7 KiB

Dynamic Table API

The dynamic table API centers on DynamicTable and allows concise runtime calls.

dynamic users = db.Table("users");

This API is best when table/column selection is dynamic or you want very short CRUD code.

Read Operations

Examples backed by DynamORM.Tests/Select/DynamicAccessTests.cs:

users.Count(columns: "id");
users.First(columns: "id");
users.Last(columns: "id");
users.Min(columns: "id");
users.Max(columns: "id");
users.Avg(columns: "id");
users.Sum(columns: "id");
users.Scalar(columns: "first", id: 19);
users.Single(id: 19);
users.Query(columns: "first,last", order: "id:desc");

Filtering with Named Arguments

users.Count(first: "Ori");
users.Single(code: "101");
users.Query(columns: "id,first", id: 19);

Conditions with DynamicColumn

users.Count(where: new DynamicColumn("id").Greater(100));
users.Count(where: new DynamicColumn("login").Like("Hoyt.%"));
users.Count(where: new DynamicColumn("id").Between(75, 100));
users.Count(where: new DynamicColumn("id").In(75, 99, 100));
users.Count(where: new DynamicColumn("id").In(new[] { 75, 99, 100 }));

Using aggregate expressions in a condition:

users.Count(condition1: new DynamicColumn
{
    ColumnName = "email",
    Aggregate = "length",
    Operator = DynamicColumn.CompareOperator.Gt,
    Value = 27
});

Insert

users.Insert(code: "201", first: "Juri", last: "Gagarin", email: "juri.gagarin@megacorp.com");

users.Insert(values: new
{
    code = "202",
    first = "Juri",
    last = "Gagarin",
    email = "juri.gagarin@megacorp.com"
});

Update

users.Update(id: 1, first: "Yuri", last: "Gagarin");

users.Update(
    values: new { first = "Yuri" },
    where: new { id = 1 });

Delete

users.Delete(code: "201");
users.Delete(where: new { id = 14, code = 14 });

Typed Dynamic Table Calls

DynamicTable methods also accept type: typeof(T) for mapped class scenarios:

users.Count(type: typeof(User), columns: "id");
users.Query(type: typeof(User));

var list = (users.Query(type: typeof(User)) as IEnumerable<object>)
    .Cast<User>()
    .ToList();

These usage patterns are covered in DynamORM.Tests/Select/TypedAccessTests.cs.

When to Prefer Fluent Builder Instead

Use fluent builders when:

  • Query structure is complex (joins/subqueries/having).
  • You need deterministic SQL text assertions.
  • You prefer strongly typed lambda parser expressions.

See Fluent Builder API.

Notes

  • Dynamic member names map to table/column names and builder conventions.
  • Unknown dynamic operations throw InvalidOperationException.
  • Explicit schema behavior depends on DynamicDatabaseOptions.SupportSchema.