DataLinq.Snowflake
1.1.0
dotnet add package DataLinq.Snowflake --version 1.1.0
NuGet\Install-Package DataLinq.Snowflake -Version 1.1.0
<PackageReference Include="DataLinq.Snowflake" Version="1.1.0" />
<PackageVersion Include="DataLinq.Snowflake" Version="1.1.0" />
<PackageReference Include="DataLinq.Snowflake" />
paket add DataLinq.Snowflake --version 1.1.0
#r "nuget: DataLinq.Snowflake, 1.1.0"
#:package DataLinq.Snowflake@1.1.0
#addin nuget:?package=DataLinq.Snowflake&version=1.1.0
#tool nuget:?package=DataLinq.Snowflake&version=1.1.0
DataLinq.Snowflake
LINQ-native Snowflake integration for DataLinq.Net.
dotnet add package DataLinq.Snowflake --version 1.1.0
Features
- Native LINQ Translation - Write C# LINQ, execute Snowflake SQL
- Streaming Results - Row-by-row processing with
IAsyncEnumerable - Type Safety - Strong typing with automatic column mapping
- SQL Injection Prevention - Parameterized queries by default
- O(1) Memory Writes - Native streaming via PUT + COPY INTO
- Cases Pattern - Multi-output conditional routing
- Auto-UDF — Custom methods in Where/Select/OrderBy/GroupBy auto-translate to Snowflake UDFs (static, instance, lambda, entity-param)
- ForEach — Server-side iteration via stored procedures with static field sync-back
- Pull() Escape Hatch - Switch to client-side streaming for edge cases
Quick Start
using DataLinq.SnowflakeQuery;
// Connect to Snowflake
using var context = Snowflake.Connect(
account: "xy12345.us-east-1",
user: "myuser",
password: "mypass",
database: "MYDB",
warehouse: "COMPUTE_WH"
);
// Query with LINQ (server-side SQL)
var orders = await context.Read.Table<Order>("orders")
.Where(o => o.Amount > 1000)
.OrderByDescending(o => o.OrderDate)
.Take(100)
.ToList();
// Client-side processing requires explicit Pull()
await context.Read.Table<Order>("orders")
.Where(o => o.Status == "Active") // Server-side SQL
.Pull() // ← Switch to client
.ForEach(o => Console.WriteLine(o)) // Client-side C#
.Do();
Write Operations
Snowflake uses native IAsyncEnumerable streaming - O(1) memory, no config needed:
// Bulk insert (streams via PUT + COPY INTO)
await records.WriteTable(options, "ORDERS");
await records.WriteTable(options, "ORDERS").CreateIfMissing();
await records.WriteTable(options, "ORDERS").Overwrite();
// Upsert (merge) on key
await records.MergeTable(options, "ORDERS", o => o.OrderId);
// Update specific columns only (type-safe expressions)
await records.MergeTable(options, "ORDERS", o => o.OrderId)
.UpdateOnly(o => o.Status, o => o.UpdatedAt);
Nested Objects (VARIANT)
Access Snowflake VARIANT columns with natural C# property syntax:
// Model with nested properties
public class Order {
public int Id { get; set; }
[Variant] // Marks column as VARIANT
public OrderData Data { get; set; }
}
// Query nested properties - translates to colon syntax
var parisOrders = await context.Read.Table<Order>("ORDERS")
.Where(o => o.Data.Customer.City == "Paris")
.ToList();
// SQL: WHERE data:customer:city = 'Paris'
Requirements
- .NET 8.0+
- DataLinq.Net 1.0.0+
- DataLinq.Snowflake license for production
Support & Issues
📧 Contact: support@get-datalinq.net
🐛 Report Issues: github.com/improveTheWorld/DataLinq.NET/issues
License
Free Developer Tier (No License Required)
Use DataLinq.Snowflake free for development and testing up to 1,000 rows per query:
| Environment | How It's Detected | Limit |
|---|---|---|
| Debugger Attached | Visual Studio, Rider, VS Code | 1,000 rows |
| ASPNETCORE_ENVIRONMENT=Development | ASP.NET apps | 1,000 rows |
| DOTNET_ENVIRONMENT=Development | Console apps | 1,000 rows |
| DATALINQ_ENVIRONMENT=Development | Explicit opt-in | 1,000 rows |
Examples:
# Option 1: Set environment variable
$env:DATALINQ_ENVIRONMENT="Development" # PowerShell
export DATALINQ_ENVIRONMENT=Development # Bash
# Option 2: Launch with debugger attached (auto-detects)
dotnet run --launch-profile "Development" # Uses launchSettings.json
# Or simply press F5 in Visual Studio/Rider
Production License
For production workloads (unlimited rows), obtain a license at:
- 🌐 Pricing: https://get-datalinq.net/pricing
- 📧 Contact: support@get-datalinq.net
Set your license key as an environment variable (auto-detected at runtime):
# PowerShell
$env:DATALINQ_LICENSE_KEY="your-license-key"
# Bash/Linux/macOS
export DATALINQ_LICENSE_KEY="your-license-key"
# Docker / Kubernetes
ENV DATALINQ_LICENSE_KEY=your-license-key
Security: The license key is never in source code. Set it in your deployment environment (CI/CD secrets, Azure Key Vault, AWS Secrets Manager, etc.)
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- DataLinq.Net (>= 1.0.0)
- Snowflake.Data (>= 5.2.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
v1.1.0: Type-safe UpdateOnly API (expression-based), undocumented API surfacing (SelectMany/LATERAL FLATTEN, GroupJoin/LEFT JOIN+GROUP BY, terminal aggregates Sum/Average/Min/Max), 11 bug fixes (SQL translation, window functions, set operations, pagination, GroupBy), enhanced obfuscation. Breaking change: UpdateOnly now requires lambda expressions. Validated across 750+ integration tests. Full notes: https://github.com/improveTheWorld/DataLinq.NET/blob/main/releasenotes/DataLinq.Snowflake_1.1.0.md