forked from coronabytes/dotnet-arangodb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArangoQueryable.cs
76 lines (65 loc) · 2.75 KB
/
ArangoQueryable.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using Core.Arango.Linq.Data;
using Core.Arango.Linq.Interface;
using Core.Arango.Relinq;
using Core.Arango.Relinq.Parsing.Structure;
namespace Core.Arango.Linq.Query
{
internal class ArangoQueryable<T> : QueryableBase<T>, IAqlModifiable<T>,
ITraversalQueryable<T>,
IShortestPathQueryable<T>
{
private readonly IArangoLinq db;
public ArangoQueryable(IQueryParser queryParser, IQueryExecutor executor, IArangoLinq db)
: base(new ArangoQueryProvider(typeof(ArangoQueryable<>), queryParser, executor, db))
{
this.db = db;
}
public ArangoQueryable(IQueryProvider provider, Expression expression, IArangoLinq db)
: base(provider, expression)
{
this.db = db;
}
public async ValueTask<List<T>> ToListAsync(CancellationToken cancellationToken = default)
{
var data = GetQueryData();
return await db.ExecuteAsync<T>(data.Query, data.BindVars, cancellationToken).ConfigureAwait(false);
}
public async ValueTask<T> SingleOrDefaultAsync(CancellationToken cancellationToken = default)
{
var data = GetQueryData();
var list = await db.ExecuteAsync<T>(data.Query, data.BindVars, cancellationToken).ConfigureAwait(false);
return list.SingleOrDefault();
}
public async ValueTask<T> SingleAsync(CancellationToken cancellationToken = default)
{
var data = GetQueryData();
var list = await db.ExecuteAsync<T>(data.Query, data.BindVars, cancellationToken).ConfigureAwait(false);
return list.Single();
}
public async ValueTask<T> FirstOrDefaultAsync(CancellationToken cancellationToken = default)
{
var data = GetQueryData();
var list = await db.ExecuteAsync<T>(data.Query, data.BindVars, cancellationToken).ConfigureAwait(false);
return list.FirstOrDefault();
}
public async ValueTask<T> FirstAsync(CancellationToken cancellationToken = default)
{
var data = GetQueryData();
var list = await db.ExecuteAsync<T>(data.Query, data.BindVars, cancellationToken).ConfigureAwait(false);
return list.First();
}
public QueryData GetQueryData()
{
var arangoQueryProvider = Provider as ArangoQueryProvider;
if (arangoQueryProvider == null)
throw new NotSupportedException("ArangoQueryable should be use with ArangoQueryProvider");
return arangoQueryProvider.GetQueryData(Expression);
}
}
}