C# 通过3个列表和一个对象返回对象
我有一个查询,它给了我一个分类测验,一个问题和一个答案,正如你在下面的查询中看到的。但是,我只想使用一个阅读器,我希望它尽可能面向对象,也就是说,我希望它是根对象。每件事都要经过测验 如何返回包含类别列表、问题列表和答案列表的测验 代码如下:C# 通过3个列表和一个对象返回对象,c#,sql,sql-server,ado.net,sqldatareader,C#,Sql,Sql Server,Ado.net,Sqldatareader,我有一个查询,它给了我一个分类测验,一个问题和一个答案,正如你在下面的查询中看到的。但是,我只想使用一个阅读器,我希望它尽可能面向对象,也就是说,我希望它是根对象。每件事都要经过测验 如何返回包含类别列表、问题列表和答案列表的测验 代码如下: public Quiz GetQuizWithCategoriesWithQuestionsWithAnswers(int id) { Quiz quiz = null; Category category = nu
public Quiz GetQuizWithCategoriesWithQuestionsWithAnswers(int id)
{
Quiz quiz = null;
Category category = null;
Question question = null;
Answer answer = null;
dbConnection.connection.Open();
using (SqlCommand command = dbConnection.connection.CreateCommand())
{
command.CommandText = "SELECT Quiz.name, Category.name AS catName, Category.id as CatId, Category.quizId, Question.[description] as questDesc, Answer.[description] as ansDesc FROM Quiz JOIN Category ON Category.quizId = Quiz.id JOIN Question ON Question.categoryId = Category.id JOIN Answer ON Answer.questionId = Question.id WHERE Quiz.id = @id";
command.Parameters.Add("@id", SqlDbType.Int).Value = id;
var reader = command.ExecuteReader();
while (reader.Read())
{
if (quiz == null)
{
quiz = new Quiz();
quiz.name = reader.GetString(reader.GetOrdinal("name"));
quiz.id = reader.GetInt32(reader.GetOrdinal("quizId"));
}
if (category != null)
{
if (category.id != reader.GetInt32(reader.GetOrdinal("CatId")))
{
category = new Category();
category.id = reader.GetInt32(reader.GetOrdinal("CatId"));
category.name = reader.GetString(reader.GetOrdinal("catName"));
quiz.categories.Add(category);
}
}
else
{
category = new Category();
category.id = reader.GetInt32(reader.GetOrdinal("CatId"));
category.name = reader.GetString(reader.GetOrdinal("catName"));
quiz.categories.Add(category);
}
if (question != null)
{
//You'll need to get the question ID or just use the description here instead for comparison
if (question.description != reader.GetString(reader.GetOrdinal("questDesc")))
{
question = new Question();
question.description = reader.GetString(reader.GetOrdinal("questDesc"));
category.question.Add(question);
}
}
else
{
question = new Question();
question.description = reader.GetString(reader.GetOrdinal("questDesc"));
category.question.Add(question);
}
answer = new Answer();
answer.description = reader.GetString(reader.GetOrdinal("ansDesc"));
question.Answers.Add(answer);
}
}
dbConnection.connection.Close();
return quiz;
}
public class Quiz
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name { get; set; }
[DataMember]
public List<Category> categories { get; set; }
[DataMember]
public List<Player> players { get; set; }
public Quiz()
{
categories = new List<Category>();
}
}
public class Category
{
[DataMember]
public int id { get; set; }
[DataMember]
public string name { get; set; }
[DataMember]
public int amount { get; set; }
[DataMember]
public List<Quiz> quiz { get; set; }
[DataMember]
public List<Question> question { get; set; }
public Category()
{
question = new List<Question>();
}
}
public class Question
{
[DataMember]
public int id { get; set; }
[DataMember]
public string description { get; set; }
[DataMember]
public Category category { get; set; }
[DataMember]
public bool isAnswered { get; set; }
[DataMember]
public List<Answer> Answers { get; set; }
public Question()
{
Answers = new List<Answer>();
}
}
public class Answer
{
[DataMember]
public int id { get; set; }
[DataMember]
public string description { get; set; }
[DataMember]
public Question question { get; set; }
[DataMember]
public bool isCorrect { get; set; }
}
GetQuizWithCategoriesWithQuestionsWithAnswers(int-id)的公共测验
{
测验=null;
类别=空;
问题=null;
答案=空;
dbConnection.connection.Open();
使用(SqlCommand命令=dbConnection.connection.CreateCommand())
{
command.CommandText=“选择quick.name,Category.name作为catName,Category.id作为CatId,Category.quizId,Question.[description]作为questDesc,Answer.[description]作为来自Category.quizId=quick.id加入Question.categoryId=Category.id加入Answer.id,其中quistion.id=@id”;
command.Parameters.Add(“@id”,SqlDbType.Int).Value=id;
var reader=command.ExecuteReader();
while(reader.Read())
{
如果(测验==null)
{
测验=新测验();
quick.name=reader.GetString(reader.GetOrdinal(“name”);
quick.id=reader.GetInt32(reader.GetOrdinal(“quizId”);
}
如果(类别!=null)
{
if(category.id!=reader.GetInt32(reader.GetOrdinal(“CatId”))
{
类别=新类别();
category.id=reader.GetInt32(reader.GetOrdinal(“CatId”);
category.name=reader.GetString(reader.GetOrdinal(“catName”));
测验。类别。添加(类别);
}
}
其他的
{
类别=新类别();
category.id=reader.GetInt32(reader.GetOrdinal(“CatId”);
category.name=reader.GetString(reader.GetOrdinal(“catName”));
测验。类别。添加(类别);
}
如果(问题!=null)
{
//您需要获取问题ID,或者只使用此处的描述进行比较
if(question.description!=reader.GetString(reader.GetOrdinal(“questDesc”))
{
问题=新问题();
question.description=reader.GetString(reader.GetOrdinal(“questDesc”));
类别.问题.添加(问题);
}
}
其他的
{
问题=新问题();
question.description=reader.GetString(reader.GetOrdinal(“questDesc”));
类别.问题.添加(问题);
}
答案=新答案();
answer.description=reader.GetString(reader.GetOrdinal(“ansDesc”));
问题。答案。添加(答案);
}
}
dbConnection.connection.Close();
回访测验;
}
公开课测验
{
[数据成员]
公共int id{get;set;}
[数据成员]
公共字符串名称{get;set;}
[数据成员]
公共列表类别{get;set;}
[数据成员]
公共列表玩家{get;set;}
公开问答
{
类别=新列表();
}
}
公共类类别
{
[数据成员]
公共int id{get;set;}
[数据成员]
公共字符串名称{get;set;}
[数据成员]
公共整数金额{get;set;}
[数据成员]
公共列表测验{get;set;}
[数据成员]
公共列表问题{get;set;}
公共类别()
{
问题=新列表();
}
}
公开课问题
{
[数据成员]
公共int id{get;set;}
[数据成员]
公共字符串说明{get;set;}
[数据成员]
公共类别{get;set;}
[数据成员]
公共布尔值被拒绝{get;set;}
[数据成员]
公共列表答案{get;set;}
公众问题(
{
答案=新列表();
}
}
公开课答案
{
[数据成员]
公共int id{get;set;}
[数据成员]
公共字符串说明{get;set;}
[数据成员]
公共问题{get;set;}
[数据成员]
公共bool isCorrect{get;set;}
}
我认为您的问题在于您丢失了这些值,因为您每次都在while循环中声明测验对象,所以它丢失了所有以前的值(列表)。您需要获取while循环之外的quick对象的基值(在另一个查询和它自己的循环中)以及每个列表的单独查询(以避免连接中的重复)
编辑:
或者只需检查测验对象是否实例化,以及是否需要为类别和问题创建新对象:
using (SqlCommand command = dbConnection.connection.CreateCommand())
{
command.CommandText = "SELECT Quiz.name, QuizCategory.quizId, QuizCategory.categoryId, Category.name AS catName, Question.[description], Answer.[description] FROM Quiz JOIN QuizCategory ON QuizCategory.quizId = Quiz.id JOIN Category ON Category.id = QuizCategory.categoryId JOIN Question ON Question.categoryId = Category.id JOIN Answer ON Answer.questionId = Question.id WHERE Quiz.id = @id";
command.Parameters.Add("@id", SqlDbType.Int).Value = id;
var reader = command.ExecuteReader();
while (reader.Read())
{
if(quiz==null)
{
quiz = new Quiz();
quiz.name = reader.GetString(reader.GetOrdinal("name"));
quiz.id = reader.GetInt32(reader.GetOrdinal("quizId"));
}
if(question!=null)
{
//You'll need to get the question ID or just use the description here instead for comparison
if(question.id!=reader.GetInt32(reader.GetOrdinal("questionId"))
{
category.question.Add(question);
question = new Question();
question.description = reader.GetString(reader.GetOrdinal("description"));
}
}
else
{
question = new Question();
question.description = reader.GetString(reader.GetOrdinal("description"));
}
if(category!=null)
{
if(category.id!=reader.GetInt32(reader.GetOrdinal("categoryId"))
{
quiz.categories.Add(category);
category = new Category();
category.id = reader.GetInt32(reader.GetOrdinal("categoryId"));
category.name = reader.GetString(reader.GetOrdinal("catName"));
}
}
else
{
category = new Category();
category.id = reader.GetInt32(reader.GetOrdinal("categoryId"));
category.name = reader.GetString(reader.GetOrdinal("catName"));
}
answer = new Answer();
answer.description = reader.GetString(reader.GetOrdinal("description"));
question.Answers.Add(answer);
}
}
if(question!=null)
{
category.question.Add(question);
}
if(category!=null)
{
quiz.categories.Add(category);
}
我认为您的问题在于您丢失了这些值,因为您每次都在while循环中声明quick对象,所以它丢失了所有以前的值(列表)。您需要获取while循环之外的quick对象的基值(在另一个查询和它自己的循环中)以及每个列表的单独查询(以避免连接中的重复) 编辑: