-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQueryService.cs
71 lines (59 loc) · 2.37 KB
/
QueryService.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
using System;
using System.Linq;
using Collections.API.Helpers;
using Collections.API.Services.Interfaces;
using MongoDB.Driver;
namespace Collections.API.Services
{
/// <summary>
/// Service for building queries for the MongoDb API
/// </summary>
/// <seealso cref="Collections.API.Services.Interfaces.IQueryService" />
public class QueryService : IQueryService
{
/// <summary>
/// Builds the query.
/// </summary>
/// <typeparam name="TInterface">The interface type</typeparam>
/// <typeparam name="TModel">The model type</typeparam>
/// <returns></returns>
public FilterDefinition<TInterface> BuildQuery<TInterface, TModel>() where TModel : class, TInterface, new()
{
return null;
}
/// <summary>
/// Builds the query.
/// </summary>
/// <typeparam name="TInterface">The interface type</typeparam>
/// <typeparam name="TModel">The model type</typeparam>
/// <param name="searchModel">The search model</param>
/// <returns></returns>
public FilterDefinition<TInterface> BuildQuery<TInterface, TModel>(TModel searchModel) where TModel : class, TInterface, new()
{
var includedFields = searchModel.ToValueDictionary();
var builder = Builders<TInterface>.Filter;
var incFilter = builder.Empty;
foreach (var incField in includedFields.ToList())
{
Type valueType = incField.Value.GetType();
if (valueType == typeof(DateTime))
{
var startDate = new DateTime(((DateTime)incField.Value).Year, 1, 1);
var endDate = new DateTime(startDate.AddYears(1).Year, 1, 1);
var test = builder.Gte(incField.Key, startDate);
incFilter |= builder.Gte(incField.Key, startDate) & builder.Lt(incField.Key, endDate);
}
if (incField.Key.Contains("["))
{
var newKey = incField.Key.Remove(incField.Key.Length - 3);
incFilter |= builder.All(newKey, new[] { incField.Value });
}
else
{
incFilter |= builder.Eq(incField.Key, incField.Value);
}
}
return incFilter;
}
}
}