Browse Source

排除已选试题

guqiang 1 month ago
parent
commit
733e01d8c1

+ 25 - 0
src/Hotline.Application/Exam/QueryExtensions/TestPapers/TestPaperQueryExtensions.cs

@@ -102,6 +102,31 @@ namespace Hotline.Application.Exam.QueryExtensions.TestPapers
             expression = ExpressionableUtility.CreateExpression<Question>()
                .AndIF(tagQuestionCountRequest.QuestionType.IsNotNull(), x => tagQuestionCountRequest.QuestionType ==x.QuestionType)
                .AndIF(tagQuestionCountRequest.DifficultyLevel.IsNotNull(),x=> tagQuestionCountRequest.DifficultyLevel == x.DifficultyLevel)
+               .AndIF(tagQuestionCountRequest.QuestionIds.IsNotNull() && tagQuestionCountRequest.QuestionIds.Any(), x => !tagQuestionCountRequest.QuestionIds.Contains(x.Id))
+               .ToExpression();
+
+            return expression;
+        }
+
+        public static Expression<Func<QuestionTag, bool>> GetExpression(this TestPaperQuestionRequest testPaperQuestionRequest)
+        {
+            Expression<Func<QuestionTag, bool>> expression = m => m.Id != null;
+
+            expression = ExpressionableUtility.CreateExpression<QuestionTag>()
+               .AndIF(testPaperQuestionRequest.TagIds.IsNotNull() && testPaperQuestionRequest.TagIds.Any(), x => testPaperQuestionRequest.TagIds.Contains(x.TagId))
+               .ToExpression();
+
+            return expression;
+        }
+
+        public static Expression<Func<Question, bool>> GetQuestionExpression(this TestPaperQuestionRequest testPaperQuestionRequest)
+        {
+            Expression<Func<Question, bool>> expression = m => m.Id != null;
+
+            expression = ExpressionableUtility.CreateExpression<Question>()
+               .AndIF(testPaperQuestionRequest.QuestionType.IsNotNull(), x => testPaperQuestionRequest.QuestionType == x.QuestionType)
+               .AndIF(testPaperQuestionRequest.DifficultyLevel.IsNotNull(), x => testPaperQuestionRequest.DifficultyLevel == x.DifficultyLevel)
+               .AndIF(testPaperQuestionRequest.QuestionIds.IsNotNull() && testPaperQuestionRequest.QuestionIds.Any(), x => !testPaperQuestionRequest.QuestionIds.Contains(x.Id))
                .ToExpression();
 
             return expression;

+ 5 - 5
src/Hotline.Application/Exam/Service/TestPapers/TestPaperService.cs

@@ -326,13 +326,13 @@ namespace Hotline.Application.Exam.Service.TestPapers
         {
             var questionRepository = new ExamRepository<Question>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider);
             var questionTagRepository = new ExamRepository<QuestionTag>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider);
-            var questionTagTable = questionTagRepository.Queryable();
-            var questionTable = questionRepository.Queryable();
+
+            var expression = testPaperQuestionRequest.GetExpression();
+            var questionExpression = testPaperQuestionRequest.GetQuestionExpression();
+            var questionTagTable = questionTagRepository.Queryable().Where(expression);
+            var questionTable = questionRepository.Queryable().Where(questionExpression);
 
             var questions = await questionTable.LeftJoin(questionTagTable, (q, qt) => q.Id == qt.QuestionId)
-                .Where((q, qt) => q.QuestionType == testPaperQuestionRequest.QuestionType
-            ).WhereIF(testPaperQuestionRequest.DifficultyLevel.IsNotNull(), (q, qt) => q.DifficultyLevel == testPaperQuestionRequest.DifficultyLevel)
-            .WhereIF(testPaperQuestionRequest.TagIds.IsNotNull() && testPaperQuestionRequest.TagIds.Any(), (q, qt) => testPaperQuestionRequest.TagIds.Contains(qt.TagId))
                 .Select((q, qt) => q).Take(testPaperQuestionRequest.Count).OrderBy(q => SqlFunc.GetRandom()).ToListAsync();
 
             var questionDtos = new List<SimpleQuestionViewResponse>();

+ 6 - 0
src/Hotline.Share/Requests/TestPaper/TagQuestionCountRequest.cs

@@ -23,5 +23,11 @@ namespace Hotline.Share.Requests.TestPaper
         /// </summary>
         [Description("难度")]
         public EDifficultyLevel? DifficultyLevel { get; set; }
+
+        /// <summary>
+        /// 已选择的试题Id
+        /// </summary>
+        [Description("已选择的试题Id")]
+        public List<string> QuestionIds { get; set; }
     }
 }

+ 6 - 0
src/Hotline.Share/Requests/TestPaper/TestPaperQuestionRequest.cs

@@ -30,5 +30,11 @@ namespace Hotline.Share.Requests.TestPaper
         [Description("难度")]
         public EDifficultyLevel? DifficultyLevel { get; set; }
 
+        /// <summary>
+        /// 已选择的试题Id
+        /// </summary>
+        [Description("已选择的试题Id")]
+        public List<string> QuestionIds { get; set; }
+
     }
 }