【问题标题】:Can I call my own methods whilst instantiating objects in Linq to SQL Query?在 Linq to SQL Query 中实例化对象时,我可以调用自己的方法吗?
【发布时间】:2015-02-25 09:24:53
【问题描述】:

我有以下疑问:

var userQuizzes = from quiz in Context.Quizzes
                  select new DashboardQuiz
                  {
                      QuizId = quiz.Id,
                      Questions = quiz.Questions
                      QuestionExcerpt = quiz.QuizVersion.Questions.FirstOrDefault().QuestionText
                      // etc...
                  }

这一切都很好,但是当模型被实例化时,是否可以调用我自己的方法对数据执行逻辑

我的Quiz POCO 类IsQuizActive() 有一个方法,它根据Quiz 中的值确定测验是否处于活动状态。

例如:

var userQuizzes = from quiz in Context.Quizzes
                  select new DashboardQuiz
                  {
                      QuizId = quiz.Id,
                      Questions = quiz.Questions
                      QuestionExcerpt = quiz.QuizVersion.Questions.FirstOrDefault().QuestionText

                      // Custom method IsQuizActive() called here
                      ActiveQuiz = quiz.IsQuizActive()
                  }

我收到一条错误消息,提示它无法转换为 LINQ,这是可以理解的,但我创建了 DashboardQuiz 以用作我的视图模型。

就目前而言,我必须遍历我的对象并创建另一个模型DashboardQuizViewModel,它可以用作每个项目的视图模型:

var userQuizzes = from quiz in Context.Quizzes
                  select new DashboardQuiz
                  {
                      QuizId = quiz.Id,
                      Questions = quiz.Questions
                      QuestionExcerpt = quiz.QuizVersion.Questions.FirstOrDefault().QuestionText
                      // I'd like to call IsQuizActive() here
                  }

List<DashboardQuizViewModel> responseModel = new List<DashboardQuizViewModel();

foreach (var dashboardQuiz in userQuizzes)
{
    DashboardQuizViewModel viewModel = new DashboardQuizViewModel();
    viewModel.QuizId = dashboardQuiz .id;
    viewModel.Questions = dashboardQuiz.Questions;
    viewModel.QuestionExcerpt = dashboardQuiz.QuestionExcerpt;

    // Call it here instead
    viewModel.ActiveQuiz = dashboardQuiz.IsQuizActive();

    responseModel.Add(viewModel);
}

return responseModel;

我能想到的唯一另一种“整洁”的方式是将IsQuizActive 作为我的视图模型上的吸气剂,并从视图中调用它。但我真的希望在将值传递给我的视图模型之前对其进行评估

【问题讨论】:

标签: c# linq ef-code-first entity-framework-6


【解决方案1】:

如果不为 sql 创建模型定义的函数,则无法完成此操作,因为查询已转换为 SQL,并且 SQL 默认情况下不会将 IsQuizActive 识别为函数。您可以将逻辑放在查询中,但它非常不整洁且效率低下。不过,您可以缩短循环的方式。我认为这应该可行(调用 toList() 会执行查询,因此如果您不想将其转换为不同的视图模型):

var userQuizzes = from quiz in Context.Quizzes
              select new DashboardQuiz
              {
                  QuizId = quiz.Id,
                  Questions = quiz.Questions
                  QuestionExcerpt =     quiz.QuizVersion.Questions.FirstOrDefault().QuestionText
                  // I'd like to call IsQuizActive() here
              }

var newUserQuizzes = userQuizzes.ToList().Select(x => {
    x.ActiveQuiz = x.IsQuizActive();
    return x;
});

【讨论】:

  • 感谢您提供更简洁的循环版本。我现在就这样做,因为我不能先在代码中执行模型定义的函数。
猜你喜欢
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多