10
10
using DynamicRepository . Extensions ;
11
11
using System . Data . Entity ;
12
12
using System . Linq . Dynamic . Core ;
13
+ using System . Threading . Tasks ;
13
14
14
15
namespace DynamicRepository . EF
15
16
{
@@ -32,6 +33,20 @@ namespace DynamicRepository.EF
32
33
/// </summary>
33
34
protected internal DbSet < Entity > DbSet ;
34
35
36
+ /// <summary>
37
+ /// Global filter instance set by <see cref="HasGlobalFilter(Expression{Func{Entity, bool}})" />
38
+ /// </summary>
39
+ private Expression < Func < Entity , bool > > GlobalFilter { get ; set ; }
40
+
41
+ /// <summary>
42
+ /// Adds a global filter expression to all operations which query for data.
43
+ /// </summary>
44
+ /// <remarks>This method was inspired by "HasQueryFilter" found on EF Core.</remarks>
45
+ public void HasGlobalFilter ( Expression < Func < Entity , bool > > filter )
46
+ {
47
+ GlobalFilter = filter ;
48
+ }
49
+
35
50
/// <summary>
36
51
/// Default constructor of main repository.
37
52
/// Required dependencies are injected.
@@ -49,30 +64,47 @@ public Repository(DbContext context)
49
64
}
50
65
51
66
/// <summary>
52
- /// Returns an instance of non-filtered IQueryable of all items in a DBSet .
67
+ /// Gets an entity instance based on its <see cref="Key"/> .
53
68
/// </summary>
54
- /// <returns>IQueryable instance of type <see cref="Entity"/></returns>
55
- internal virtual IQueryable < Entity > List ( )
69
+ /// <param name="key">The desired entity key value.</param>
70
+ /// <returns>Persisted entity if found, otherwise NULL.</returns>
71
+ public virtual Entity Get ( Key key )
56
72
{
57
- return DbSet ;
73
+ Entity queriedEntity ;
74
+
75
+ if ( key is Array )
76
+ {
77
+ // This is to handle entity framework find by composite key
78
+ queriedEntity = DbSet . Find ( ( key as IEnumerable ) . Cast < object > ( ) . ToArray ( ) ) ;
79
+ }
80
+ else
81
+ {
82
+ queriedEntity = DbSet . Find ( key ) ;
83
+ }
84
+
85
+ return GlobalFilter != null ? new [ ] { queriedEntity } . AsQueryable ( ) . FirstOrDefault ( GlobalFilter ) : queriedEntity ;
58
86
}
59
87
60
88
/// <summary>
61
89
/// Gets an entity instance based on its <see cref="Key"/>.
62
90
/// </summary>
63
91
/// <param name="key">The desired entity key value.</param>
64
92
/// <returns>Persisted entity if found, otherwise NULL.</returns>
65
- public virtual Entity Get ( Key key )
93
+ public virtual async Task < Entity > GetAsync ( Key key )
66
94
{
95
+ Entity queriedEntity ;
96
+
67
97
if ( key is Array )
68
98
{
69
99
// This is to handle entity framework find by composite key
70
- return DbSet . Find ( ( key as IEnumerable ) . Cast < object > ( ) . ToArray ( ) ) ;
100
+ queriedEntity = await DbSet . FindAsync ( ( key as IEnumerable ) . Cast < object > ( ) . ToArray ( ) ) ;
71
101
}
72
102
else
73
103
{
74
- return DbSet . Find ( key ) ;
104
+ queriedEntity = await DbSet . FindAsync ( key ) ;
75
105
}
106
+
107
+ return GlobalFilter != null ? await new [ ] { queriedEntity } . AsQueryable ( ) . FirstOrDefaultAsync ( GlobalFilter ) : queriedEntity ;
76
108
}
77
109
78
110
/// <summary>
@@ -84,6 +116,15 @@ public virtual void Insert(Entity entity)
84
116
DbSet . Add ( entity ) ;
85
117
}
86
118
119
+ /// <summary>
120
+ /// Persists a new entity model.
121
+ /// </summary>
122
+ /// <param name="entity">The new <see cref="Entity"/> instance to be persisted.</param>
123
+ public virtual Task InsertAsync ( Entity entity )
124
+ {
125
+ return Task . Run ( ( ) => DbSet . Add ( entity ) ) ;
126
+ }
127
+
87
128
/// <summary>
88
129
/// Updates an existing persisted entity.
89
130
/// </summary>
@@ -93,13 +134,31 @@ public virtual void Update(Entity entityToUpdate)
93
134
Context . Entry ( entityToUpdate ) . State = EntityState . Modified ;
94
135
}
95
136
137
+ /// <summary>
138
+ /// Updates an existing persisted entity.
139
+ /// </summary>
140
+ /// <param name="entityToUpdate">The <see cref="Entity"/> instance to be updated.</param>
141
+ public virtual Task UpdateAsync ( Entity entityToUpdate )
142
+ {
143
+ return Task . Run ( ( ) => Context . Entry ( entityToUpdate ) . State = EntityState . Modified ) ;
144
+ }
145
+
96
146
/// <summary>
97
147
/// Deletes an existing entity.
98
148
/// </summary>
99
149
/// <param name="id">The primary key of the <see cref="Entity"/> to be deleted.</param>
100
150
public virtual void Delete ( Key id )
101
151
{
102
- Delete ( this . Get ( id ) ) ;
152
+ Delete ( Get ( id ) ) ;
153
+ }
154
+
155
+ /// <summary>
156
+ /// Deletes an existing entity.
157
+ /// </summary>
158
+ /// <param name="id">The primary key of the <see cref="Entity"/> to be deleted.</param>
159
+ public virtual Task DeleteAsync ( Key id )
160
+ {
161
+ return Task . Run ( async ( ) => DeleteAsync ( await GetAsync ( id ) ) ) ;
103
162
}
104
163
105
164
/// <summary>
@@ -114,12 +173,34 @@ public void Delete(Entity entityToDelete)
114
173
}
115
174
}
116
175
176
+ /// <summary>
177
+ /// Deletes an existing entity.
178
+ /// </summary>
179
+ /// <param name="entityToDelete">The <see cref="Entity"/> instance to be deleted.</param>
180
+ public Task DeleteAsync ( Entity entityToDelete )
181
+ {
182
+ if ( entityToDelete != null )
183
+ {
184
+ return Task . Run ( ( ) => DbSet . Remove ( entityToDelete ) ) ;
185
+ }
186
+
187
+ return Task . CompletedTask ;
188
+ }
189
+
117
190
/// <summary>
118
191
/// Returns all entries of this entity.
119
192
/// </summary>
120
193
public IEnumerable < Entity > ListAll ( )
121
194
{
122
- return this . DbSet . ToList ( ) ;
195
+ return GetQueryable ( ) ;
196
+ }
197
+
198
+ /// <summary>
199
+ /// Gets a queryable instance of the current data set.
200
+ /// </summary>
201
+ public IQueryable < Entity > GetQueryable ( )
202
+ {
203
+ return GlobalFilter != null ? DbSet . AsQueryable ( ) . Where ( GlobalFilter ) : DbSet . AsQueryable ( ) ;
123
204
}
124
205
125
206
/// <summary>
@@ -137,7 +218,7 @@ public IEnumerable<Entity> List(
137
218
Func < IQueryable < Entity > , IOrderedQueryable < Entity > > orderBy = null ,
138
219
params string [ ] includeProperties )
139
220
{
140
- IQueryable < Entity > query = DbSet ;
221
+ IQueryable < Entity > query = GetQueryable ( ) ;
141
222
142
223
if ( filter != null )
143
224
{
@@ -159,25 +240,14 @@ public IEnumerable<Entity> List(
159
240
}
160
241
}
161
242
162
- /// <summary>
163
- /// Returns <see cref="IQueryable"/> for consumers to shape queries as they need to.
164
- /// </summary>
165
- /// <returns>
166
- /// Plain DbSet as Queryable.
167
- /// </returns>
168
- protected internal IQueryable < Entity > AsQueryable ( )
169
- {
170
- return DbSet . AsQueryable ( ) ;
171
- }
172
-
173
243
/// <summary>
174
244
/// Returns a collection of data results that can be paged.
175
245
/// </summary>
176
246
/// <param name="settings">Settings for the search.</param>
177
247
/// <returns>Filled PagedData instance.</returns>
178
248
public IPagedDataResult < Entity > GetPagedData ( PagedDataSettings settings )
179
249
{
180
- return _dataSourcePager . GetPagedData ( ( IQueryable < Entity > ) this . List ( ) , settings , this . AddPreConditionsPagedDataFilter ( settings ) , this . AddExtraPagedDataFilter ( settings ) ) ;
250
+ return _dataSourcePager . GetPagedData ( GetQueryable ( ) , settings , AddPreConditionsPagedDataFilter ( settings ) , AddExtraPagedDataFilter ( settings ) ) ;
181
251
}
182
252
183
253
/// <summary>
0 commit comments