-1
내가 복잡한 쿼리를 컴파일 된 쿼리로 변환하고 코드를 깨끗하게 유지하는 방법을 알아 내려고 시도 중입니다. 이것은 복잡하지는 않지만 그 예는 훨씬 복잡한 쿼리입니다.복잡한 linq 컴파일 쿼리
그래서 나는이 예상 쿼리 변환하고 싶습니다 :
public List<Answer> GetAnswers(int pQuestionId, string pSearch, int? pSkip, int? pTake, GetAnswersOrderBy pOrderBy, bool pOrderByIsAscending, out int pTotalNumberOfLines)
{
var compiledQuery = CompiledGetAnswers(params...);
var projectedQuery = compiledQuery .Select(s =>
new
{
Answer = s,
s.AnswerTranslations,
AnswerTranslationsLanguages = s.AnswerTranslations.Select(qt => qt.Language),
}).ToList();
return projectedQuery.Select(s => new GetAnswers()
{
Id = s.Answer.Id,
Label = s.Answer.Label,
CorrectAnswer = s.Answer.CorrectAnswer,
Feedback = s.Answer.Feedback,
Weighting = s.Answer.Weighting
}).ToList();
}
public static Func<AppDbContext, Answer, IQueryable<Answer>> CompiledGetAnswers(int pQuestionId, string pSearch, int? pSkip, int? pTake, GetAnswersOrderBy pOrderBy, bool pOrderByIsAscending, out int pTotalNumberOfLines)
{
string search = pSearch.ToUpper().Replace(" ", "");
string languageCode = Thread.CurrentThread.CurrentCulture.ToString().ToLower().Substring(0, 2);
IQueryable<Answer> query = this.Context.Set<Answer>();
//Filter question by questionnaire
query = query.Where(w => w.QuestionID == pQuestionId);
if (!string.IsNullOrEmpty(pSearch))
query = query.Where(w => (w.AnswerTranslations.Any(a => languageCode == a.LanguageCode)
? w.AnswerTranslations.FirstOrDefault(a => languageCode == a.LanguageCode).Label
: w.AnswerTranslations.OrderBy(o => o.Language.Priority).FirstOrDefault().Label)
.ToUpper().Replace(" ", "")
.Contains(search));
switch (pOrderBy)
{
case GetAnswersOrderBy.CorrectAnswer:
query = pOrderByIsAscending ? query.OrderBy(w => w.CorrectAnswer) : query.OrderByDescending(w => w.CorrectAnswer);
break;
case GetAnswersOrderBy.ResponseCount:
query = pOrderByIsAscending ? query.OrderBy(w => w.ResponseCount) : query.OrderByDescending(w => w.ResponseCount);
break;
default:
break;
}
pTotalNumberOfLines = query.Count();
var pagedQuery = query.Skip(pSkip ?? 0)
.Take(pTake ?? pTotalNumberOfLines);
return CompiledQuery(AppDbContext db, Answer a) => pagedQuery;
}
당신은 거의 그것을하고 있습니다. –