@@ -17,7 +17,7 @@ public override User GetById(int id)
17
17
{
18
18
using ( EfDbContext context = new EfDbContext ( ) )
19
19
{
20
- return context . Users . Include ( x=> x . Profile . Comments ) . FirstOrDefault ( x=> x . User_ID == id ) ;
20
+ return context . Users . Include ( x => x . Profile . Comments ) . FirstOrDefault ( x => x . User_ID == id ) ;
21
21
}
22
22
}
23
23
@@ -48,7 +48,7 @@ public IList<Role> GetRoles(int userId)
48
48
{
49
49
using ( EfDbContext context = new EfDbContext ( ) )
50
50
{
51
- return context . Users . FirstOrDefault ( u => u . User_ID == userId ) . Roles . ToList ( ) ;
51
+ return context . Users . Include ( x => x . Roles ) . FirstOrDefault ( u => u . User_ID == userId ) . Roles . ToList ( ) ;
52
52
}
53
53
}
54
54
@@ -62,11 +62,11 @@ public User GetUserByEmail(string email)
62
62
63
63
using ( EfDbContext context = new EfDbContext ( ) )
64
64
{
65
- return context . Users . Include ( x=> x . Profile )
65
+ return context . Users . Include ( x => x . Profile )
66
66
. Include ( e => e . Roles )
67
- . Include ( x => x . Profile . WishedBooks . Select ( c=> c . Book . BookAuthors ) )
67
+ . Include ( x => x . Profile . WishedBooks . Select ( c => c . Book . BookAuthors ) )
68
68
. Include ( x => x . Profile . RatedBooks . Select ( b => b . Book . Book . BookAuthors ) )
69
- . Include ( x => x . Profile . FavoriteAuthors . Select ( c=> c . Author ) )
69
+ . Include ( x => x . Profile . FavoriteAuthors . Select ( c => c . Author ) )
70
70
. FirstOrDefault ( e => e . Email == email ) ;
71
71
}
72
72
}
@@ -80,7 +80,7 @@ public async Task RateBook(float rate, int userId, int bookId, bool isSuggestion
80
80
Book book = context . Books . FirstOrDefault ( x => x . Book_ID == bookId ) ;
81
81
Rate rating = context . Rates .
82
82
FirstOrDefault ( x => x . User . User_ID == userId && x . Book . Book_ID == bookId ) ??
83
- new Rate ( ) { User = context . Users . FirstOrDefault ( x=> x . User_ID == userId ) . Profile } ;
83
+ new Rate ( ) { User = context . Users . FirstOrDefault ( x => x . User_ID == userId ) . Profile } ;
84
84
rating . RateValue = rate ;
85
85
rating . IsSuggestion = isSuggestion ;
86
86
book . BookDetail . RatedUsers . Add ( rating ) ;
@@ -132,19 +132,22 @@ public override void Create(User obj)
132
132
user . Users . Add ( obj ) ;
133
133
context . SaveChanges ( ) ;
134
134
}
135
- }
135
+ }
136
136
137
- public void Suggest ( float rate , int userId , int bookId , bool isSuggestion )
137
+ public void Suggest ( float rate , int userId , int bookId , bool isSuggestion )
138
138
{
139
139
using ( EfDbContext context = new EfDbContext ( ) )
140
140
{
141
- Book book = context . Books . FirstOrDefault ( x => x . Book_ID == bookId ) ;
142
141
Rate rating = context . Rates .
143
142
FirstOrDefault ( x => x . User . User_ID == userId && x . Book . Book_ID == bookId ) ??
144
- new Rate ( ) { User = context . Users . FirstOrDefault ( x=> x . User_ID == userId ) . Profile } ;
143
+ new Rate ( )
144
+ {
145
+ User = context . Users . Include ( x => x . Profile ) . FirstOrDefault ( x => x . User_ID == userId ) . Profile ,
146
+ Book = context . Books . Include ( x => x . BookDetail ) . FirstOrDefault ( x => x . Book_ID == bookId ) . BookDetail
147
+ } ;
145
148
rating . RateValue = rate ;
146
149
rating . IsSuggestion = isSuggestion ;
147
- book . BookDetail . RatedUsers . Add ( rating ) ;
150
+ context . Rates . Add ( rating ) ;
148
151
context . SaveChanges ( ) ;
149
152
}
150
153
}
@@ -186,7 +189,7 @@ public void Resuggest()
186
189
else
187
190
{
188
191
matr [ i ] [ j ] =
189
- ( new Rate { User = context . Users . FirstOrDefault ( x=> x . User_ID == user . Value . User_ID ) . Profile , Book = new BookDetail ( ) { Book_ID = books [ j ] . Book_ID } } ) ;
192
+ ( new Rate { User = context . Users . FirstOrDefault ( x => x . User_ID == user . Value . User_ID ) . Profile , Book = new BookDetail ( ) { Book_ID = books [ j ] . Book_ID } } ) ;
190
193
}
191
194
}
192
195
}
@@ -273,91 +276,100 @@ public void Resuggest()
273
276
274
277
public void Resuggest1 ( )
275
278
{
279
+ List < Rate > dbRates = new List < Rate > ( ) ;
276
280
using ( EfDbContext context = new EfDbContext ( ) )
277
281
{
278
- var users = context . Users . Include ( x=> x . Profile . RatedBooks ) . ToList ( ) ;
279
- var books = context . Books . Include ( x=> x . BookDetail . RatedUsers ) . ToList ( ) ;
280
- int maxBookId = context . Books . Select ( x => x . Book_ID ) . Max ( ) ;
281
- float [ , ] matrix = new float [ users . Count , books . Count ] ;
282
- float [ , ] result = new float [ users . Count , books . Count ] ;
283
- Rate [ , ] matr = new Rate [ users . Count , books . Count ] ;
284
- int rateCounter = 0 ;
285
- //int[,] korelation = new int[users.Count, users.Count];
286
- float [ , ] corelation = new float [ users . Count , users . Count ] ;
287
- //List<double> corelation = new List<double>();
288
- List < float > average = new List < float > ( ) ;
289
- List < float > diff = new List < float > ( ) ;
290
- for ( int i = 0 ; i < users . Count ; i ++ )
282
+ dbRates = context . Rates . Include ( i => i . Book ) . Include ( i => i . User ) . ToList ( ) ;
283
+ }
284
+ HashSet < int > bookIds = new HashSet < int > ( ) ;
285
+ HashSet < int > userIds = new HashSet < int > ( ) ;
286
+ foreach ( var dbRate in dbRates )
287
+ {
288
+ if ( ! bookIds . Contains ( dbRate . Book . Book_ID ) )
291
289
{
292
- var rates = users [ i ] . Profile . RatedBooks . Where ( x => x . IsSuggestion == false ) . ToList ( ) ;
293
- float averageRate = 0 ;
294
- int countNonZero = 0 ;
295
- for ( int j = 0 ; j < books . Count ; j ++ )
290
+ bookIds . Add ( dbRate . Book . Book_ID ) ;
291
+ }
292
+ if ( ! userIds . Contains ( dbRate . User . User_ID ) )
293
+ {
294
+ userIds . Add ( dbRate . User . User_ID ) ;
295
+ }
296
+ }
297
+ float [ , ] result = new float [ userIds . Count , bookIds . Count ] ;
298
+ Rate [ , ] matr = new Rate [ userIds . Count , bookIds . Count ] ;
299
+ int rateCounter = 0 ;
300
+ float [ , ] corelation = new float [ userIds . Count , userIds . Count ] ;
301
+ List < float > average = new List < float > ( ) ;
302
+ List < float > diff = new List < float > ( ) ;
303
+ for ( int i = 0 ; i < userIds . Count ; i ++ )
304
+ {
305
+ float averageRate = 0 ;
306
+ int countNonZero = 0 ;
307
+ for ( int j = 0 ; j < bookIds . Count ; j ++ )
308
+ {
309
+ var rate = dbRates . FirstOrDefault ( x => x . IsSuggestion == false && x . Book . Book_ID == bookIds . ElementAt ( j ) && x . User . User_ID == userIds . ElementAt ( i ) ) ;
310
+ if ( rate != null )
296
311
{
297
- var rate = rates . FirstOrDefault ( x => x . Book . Book_ID == books [ j ] . Book_ID ) ;
298
- if ( rate != null )
299
- {
300
- matr [ i , j ] = rate ;
301
- rateCounter ++ ;
302
- averageRate += rate . RateValue ;
303
- countNonZero ++ ;
304
- average . Add ( averageRate / countNonZero ) ;
305
- }
306
- else
307
- {
308
- matr [ i , j ] =
309
- ( new Rate { User = users [ i ] . Profile , IsSuggestion = true , Book = books [ j ] . BookDetail } ) ;
310
- }
312
+ matr [ i , j ] = rate ;
313
+ rateCounter ++ ;
314
+ averageRate += rate . RateValue ;
315
+ countNonZero ++ ;
316
+ average . Add ( averageRate / countNonZero ) ;
317
+ }
318
+ else
319
+ {
320
+ matr [ i , j ] =
321
+ ( new Rate { IsSuggestion = true } ) ;
311
322
}
312
- if ( i > 0 )
323
+ }
324
+ if ( i > 0 )
325
+ {
326
+ for ( int k = 1 ; k <= i ; k ++ ) //ïî þçåðàì
313
327
{
314
- for ( int k = 1 ; k <= i ; k ++ ) //ïî þçåðàì
328
+ double kor = 0 ;
329
+ float sum = 0 , sumSquare1 = 0 , sumSquare2 = 0 ;
330
+ for ( int j = 0 ; j < bookIds . Count ; j ++ ) //ïî êíèæêàì
315
331
{
316
- double kor = 0 ;
317
- float sum = 0 , sumSquare1 = 0 , sumSquare2 = 0 ;
318
- for ( int j = 0 ; j < books . Count ; j ++ ) //ïî êíèæêàì
332
+ if ( ! matr [ i , j ] . IsSuggestion && ! matr [ i - k , j ] . IsSuggestion )
319
333
{
320
- if ( ! matr [ i , j ] . IsSuggestion && ! matr [ i - k , j ] . IsSuggestion )
321
- {
322
- sum += ( matr [ i , j ] . RateValue - average . ElementAt ( i ) ) *
323
- ( matr [ i - k , j ] . RateValue - average . ElementAt ( i - k ) ) ;
324
- sumSquare1 += ( matr [ i , j ] . RateValue - average . ElementAt ( i ) ) *
325
- ( matr [ i , j ] . RateValue - average . ElementAt ( i ) ) ;
326
- sumSquare2 += ( matr [ i - k , j ] . RateValue - average . ElementAt ( i - k ) ) *
327
- ( matr [ i - k , j ] . RateValue - average . ElementAt ( i - k ) ) ;
328
- }
334
+ sum += ( matr [ i , j ] . RateValue - average . ElementAt ( i ) ) *
335
+ ( matr [ i - k , j ] . RateValue - average . ElementAt ( i - k ) ) ;
336
+ sumSquare1 += ( matr [ i , j ] . RateValue - average . ElementAt ( i ) ) *
337
+ ( matr [ i , j ] . RateValue - average . ElementAt ( i ) ) ;
338
+ sumSquare2 += ( matr [ i - k , j ] . RateValue - average . ElementAt ( i - k ) ) *
339
+ ( matr [ i - k , j ] . RateValue - average . ElementAt ( i - k ) ) ;
329
340
}
330
- diff . Add ( sumSquare1 ) ;
331
- kor = sum / ( Math . Sqrt ( sumSquare1 ) * Math . Sqrt ( sumSquare2 ) ) ;
332
- corelation [ i , i - k ] = corelation [ i - k , i ] = ( float ) kor ;
333
341
}
342
+ diff . Add ( sumSquare1 ) ;
343
+ kor = sum / ( Math . Sqrt ( sumSquare1 ) * Math . Sqrt ( sumSquare2 ) ) ;
344
+ corelation [ i , i - k ] = corelation [ i - k , i ] = ( float ) kor ;
334
345
}
335
346
}
336
- Rate [ , ] SubMatrix = ( Rate [ , ] ) matr . Clone ( ) ;
337
- for ( int i = 0 ; i < SubMatrix . GetLength ( 0 ) ; i ++ )
347
+ }
348
+ Rate [ , ] subMatrix = ( Rate [ , ] ) matr . Clone ( ) ;
349
+ for ( int i = 0 ; i < subMatrix . GetLength ( 0 ) ; i ++ )
350
+ {
351
+ for ( int j = 0 ; j < subMatrix . GetLength ( 1 ) ; j ++ )
338
352
{
339
- for ( int j = 0 ; j < SubMatrix . GetLength ( 1 ) ; j ++ )
353
+ if ( subMatrix [ i , j ] . IsSuggestion )
340
354
{
341
- if ( SubMatrix [ i , j ] . IsSuggestion )
355
+ float sum = 0 ;
356
+ float sumCor = 0 ;
357
+ for ( int k = 0 ; k < subMatrix . GetLength ( 0 ) ; k ++ )
342
358
{
343
- float sum = 0 ;
344
- float sumCor = 0 ;
345
- for ( int k = 0 ; k < SubMatrix . GetLength ( 0 ) ; k ++ )
346
- {
347
- if ( ! SubMatrix [ k , j ] . IsSuggestion && ! float . IsNaN ( average [ k ] ) )
348
- {
349
- sum += ( SubMatrix [ k , j ] . RateValue - average [ k ] ) * corelation [ k , i ] ;
350
- sumCor += Math . Abs ( corelation [ k , i ] ) ;
351
- }
352
- }
353
- if ( sum != 0 && ! float . IsNaN ( sum ) )
359
+ if ( ! subMatrix [ k , j ] . IsSuggestion && ! float . IsNaN ( average [ k ] ) )
354
360
{
355
- Suggest ( ( average [ i ] + sum / sumCor ) > 10 ? 10 : ( average [ i ] + sum / sumCor ) , users [ i ] . User_ID , books [ j ] . Book_ID , true ) ;
356
- result [ i , j ] = average [ i ] + sum / sumCor ;
361
+ sum += ( subMatrix [ k , j ] . RateValue - average [ k ] ) * corelation [ k , i ] ;
362
+ sumCor += Math . Abs ( corelation [ k , i ] ) ;
357
363
}
358
364
}
365
+ if ( sum != 0 && ! float . IsNaN ( sum ) )
366
+ {
367
+ Suggest ( ( average [ i ] + sum / sumCor ) > 10 ? 10 : ( average [ i ] + sum / sumCor ) , userIds . ElementAt ( i ) , bookIds . ElementAt ( j ) , true ) ;
368
+ result [ i , j ] = average [ i ] + sum / sumCor ;
369
+ }
359
370
}
360
371
}
372
+
361
373
}
362
374
}
363
375
}
0 commit comments