我可以在 Linq to SQL Query 中实例化对象时调用自己的方法吗?
Can I call my own methods whilst instantiating objects in Linq to SQL Query?
我有以下查询:
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 class 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;
我能想到的唯一其他 'tidy' 方法是将 IsQuizActive
作为我的视图模型上的 getter 并从视图中调用它。但我真的希望在将值传递给我的视图模型之前对其进行评估
如果不为 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;
});
我有以下查询:
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 class 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;
我能想到的唯一其他 'tidy' 方法是将 IsQuizActive
作为我的视图模型上的 getter 并从视图中调用它。但我真的希望在将值传递给我的视图模型之前对其进行评估
如果不为 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;
});