Vit.Linq
3.1.5
dotnet add package Vit.Linq --version 3.1.5
NuGet\Install-Package Vit.Linq -Version 3.1.5
<PackageReference Include="Vit.Linq" Version="3.1.5" />
paket add Vit.Linq --version 3.1.5
#r "nuget: Vit.Linq, 3.1.5"
// Install Vit.Linq as a Cake Addin #addin nuget:?package=Vit.Linq&version=3.1.5 // Install Vit.Linq as a Cake Tool #tool nuget:?package=Vit.Linq&version=3.1.5
Vit.Linq
Vit.Linq provides two tools for handling Expressions: Filter and ExpressionTree.
- Filter can convert between FilterRule and Expression Predicate, allowing for dynamic filtering of result sets using JSON data.
- ExpressionTree facilitates the conversion between ExpressionNode and Expression, enabling transformations between data and code.
Note: Since non-primitive types cannot be transmitted via data formats, the conversion may not be fully equivalent, and some type information might be lost.
source address: https://github.com/Vit-Orm/Vit.Linq
Build | NuGet |
---|---|
FilterRules
FilterRule can express logical combinations (And / Or / Not) and basic logical evaluations (such as numerical comparisons / string matching / null checks, etc.). The complete set of features is as follows:
- And
- Or
- Not
- NotAnd
- NotOr
- Logical Judgement
- [object] is null (==null) / is not null (!=null)
- [numeric] compare: == != > >= < ⇐
- [string] compare: Contains NotContain StartsWith EndsWith IsNullOrEmpty IsNotNullOrEmpty
- [array] contains: In / NotIn
- custom operator
Example
Install necessary packages:
dotnet add package Vit.Linq
dotnet add package Vit.Core
Create console project and edit Program.cs
code address: Program.cs
using Vit.Core.Module.Serialization;
using Vit.Linq;
using Vit.Linq.FilterRules.ComponentModel;
namespace App
{
internal class Program
{
static void Main(string[] args)
{
var users = new[] { new { id = 1, name = "name1" }, new { id = 2, name = "name2" } };
var strRule = "{\"field\":\"id\", \"operator\": \"=\", \"value\": 1 }";
var rule = Json.Deserialize<FilterRule>(strRule);
var result = users.AsQueryable().Where(rule).ToList();
var count = result.Count;
}
}
}
FilterRule Format
FilterRule is JSON-formatted data where the condition can be
and
,or
,not
,notand
, ornotor
(a combination ofnot
andor
).
rules
can be nested FilterRules.
field
can be a nested property, such asid
orjob.name
.
operator
can be one of the following:IsNull
,IsNotNull
,In
,NotIn
,=
,!=
,>
,>=
,<
,<=
,Contains
,NotContain
,StartsWith
,EndsWith
,IsNullOrEmpty
,IsNotNullOrEmpty
, etc.
{
"condition": "and",
"rules": [
{
"field": "job.name",
"operator": "!=",
"value": "name987_job1"
},
{
"field": "name",
"operator": "IsNotNull"
},
{
"field": "name",
"operator": "NotIn",
"value": [
"name3",
"name4"
]
}
]
}
ExpressionNodes
ExpressionNode enables the transformation between ExpressionNode (data) and Expression (code), allowing for data and code interchangeability. It supports all query-related expressions (excluding functionalities like Expression.Assign).
Example
Install necessary packages:
dotnet add package Vit.Linq
dotnet add package Vit.Core
Create console project and edit Program.cs
code address: Program.cs
using Vit.Core.Module.Serialization;
using Vit.Linq;
using Vit.Linq.ExpressionNodes;
namespace App
{
internal class Program2
{
static void Main2(string[] args)
{
var users = new[] { new User(1), new User(2), new User(3), new User(4) };
var query = users.AsQueryable();
var queryExpression = users.AsQueryable().Where(m => m.id > 0).OrderBy(m => m.id).Skip(1).Take(2);
#region #1 Expression to ExpressionNode (Code to Data)
var node = ExpressionConvertService.Instance.ConvertToData_LambdaNode(queryExpression.Expression);
var strNode = Json.Serialize(node);
#endregion
#region #2 ExpressionNode to QueryAction
var queryAction = new Vit.Linq.ExpressionNodes.Query.QueryAction(node);
var strQuery = Json.Serialize(queryAction);
#endregion
// #3 compile code
var predicate = ExpressionConvertService.Instance.ConvertToCode_PredicateExpression<User>(queryAction.filter);
//var lambdaExp = (Expression<Func<Person, bool>>)convertService.ToLambdaExpression(queryAction.filter, typeof(User));
var rangedQuery = query.Where(predicate).OrderBy(queryAction.orders);
if (queryAction.skip.HasValue)
rangedQuery = rangedQuery.Skip(queryAction.skip.Value);
if (queryAction.take.HasValue)
rangedQuery = rangedQuery.Take(queryAction.take.Value);
var result = rangedQuery.ToList();
var count = result.Count;
}
class User
{
public User(int id) { this.id = id; this.name = "name" + id; }
public int id { get; set; }
public string name { get; set; }
}
}
}
Examples:
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. 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. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages (3)
Showing the top 3 NuGet packages that depend on Vit.Linq:
Package | Downloads |
---|---|
Vit.Orm.EntityFramework
entensions for EntityFramework |
|
Vitorm
Vitorm : simple orm |
|
Vitorm.ElasticSearch.QueryBuilder
Tool to convert FilterRule or ExpressionNode to ElasticSearch Query Request |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
3.1.5 | 386 | 11/4/2024 |
3.1.4 | 376 | 10/30/2024 |
3.1.3 | 455 | 10/10/2024 |
3.1.2 | 737 | 8/31/2024 |
3.1.1 | 427 | 8/29/2024 |
3.1.0 | 847 | 8/22/2024 |
3.0.3 | 723 | 8/8/2024 |
3.0.2 | 232 | 7/29/2024 |
3.0.1 | 398 | 7/22/2024 |
3.0.1-preview | 268 | 7/21/2024 |
3.0.0 | 278 | 7/14/2024 |
3.0.0-preview | 247 | 7/14/2024 |
2.2.25-preview | 213 | 7/14/2024 |
2.2.24-preview | 279 | 7/7/2024 |
2.2.23 | 106 | 7/3/2024 |
2.2.22 | 604 | 6/16/2024 |
2.2.21 | 199 | 2/2/2024 |
2.2.20 | 147 | 2/1/2024 |
2.2.19 | 157 | 1/31/2024 |
2.2.18 | 310 | 1/22/2024 |
2.2.17 | 167 | 1/19/2024 |
2.2.16 | 113 | 1/17/2024 |
2.2.15 | 118 | 1/17/2024 |
2.2.14 | 124 | 1/12/2024 |
2.2.13 | 239 | 12/21/2023 |
2.2.12 | 350 | 7/30/2023 |
2.2.11 | 319 | 5/19/2023 |
2.2.10 | 1,104 | 7/26/2022 |
2.2.10-preview6 | 306 | 4/5/2022 |
2.2.10-preview5 | 341 | 4/2/2022 |
2.2.9 | 1,299 | 2/19/2022 |
2.2.8 | 1,020 | 9/27/2021 |
2.2.7 | 1,111 | 9/9/2021 |
2.2.6 | 1,152 | 8/22/2021 |
2.2.5 | 835 | 8/21/2021 |
2.2.4 | 822 | 8/18/2021 |
2.2.2 | 1,242 | 6/5/2021 |
2.2.1.658 | 1,118 | 5/27/2021 |
2.2.0.635 | 1,145 | 5/20/2021 |
2.1.4.514 | 1,681 | 4/22/2021 |
2.1.3.499 | 1,736 | 4/20/2021 |
2.1.1.602 | 1,700 | 4/15/2021 |
2.1.1.499 | 1,617 | 2/22/2021 |
2.1.1.494 | 1,632 | 2/8/2021 |
2.1.1.487 | 1,637 | 2/7/2021 |
2.1.1.482 | 1,615 | 2/3/2021 |
2.1.1.478 | 1,720 | 2/2/2021 |
2.1.1.476 | 1,720 | 1/29/2021 |
2.1.1.461 | 1,696 | 1/22/2021 |
2.1.1.453 | 1,787 | 1/15/2021 |
2.1.1.425 | 1,038 | 11/24/2020 |
2.1.1.423 | 1,082 | 11/24/2020 |
2.1.1.419 | 1,115 | 11/11/2020 |
2.1.1.413 | 1,285 | 11/11/2020 |
2.1.1.410 | 1,144 | 10/12/2020 |
2.1.1.404 | 1,115 | 9/28/2020 |
2.1.1.392 | 1,296 | 9/16/2020 |
2.1.1.384 | 1,142 | 8/27/2020 |
2.1.1.378 | 1,345 | 8/8/2020 |
2.1.1.359 | 1,123 | 7/7/2020 |
2.1.1.352 | 1,238 | 6/17/2020 |
2.1.1.348 | 1,182 | 5/29/2020 |
2.1.1.345 | 1,302 | 5/6/2020 |
2.1.1.341 | 1,256 | 4/20/2020 |
2.1.1.334 | 1,237 | 4/10/2020 |
2.1.1.324 | 1,024 | 4/3/2020 |
2.1.1.322 | 1,250 | 4/1/2020 |
2.1.1.319 | 1,191 | 3/31/2020 |
2.1.1.318 | 1,193 | 3/25/2020 |
2.1.1.315 | 1,312 | 3/23/2020 |
2.1.1.312 | 1,206 | 3/17/2020 |
2.1.1.307 | 1,290 | 3/12/2020 |
2.1.1.304 | 1,229 | 3/10/2020 |
2.1.1.300 | 1,163 | 3/9/2020 |
2.1.1.296 | 1,205 | 3/4/2020 |
2.1.1.291 | 1,172 | 3/3/2020 |
2.1.1.290 | 1,434 | 3/2/2020 |
2.1.1.250 | 1,213 | 2/17/2020 |