我想创建一个民意调查。我有一个问题表(字段:ID,问题)和另一个答案(字段:ID,QuestionID,答案)。有一个结果表(字段:QuestionID,AnswerID,UserID)。我想显示响应datagridview中任何项目的百分比。 例如,当我输入问题ID时,datagridview显示:
1 ------------------------- 30
2 -------------------------- 20
3 --------------------------- 50
4 -------------------------- 10
这是我的代码但是结果没有显示出来:
int a = Convert.ToInt32(textBox1.Text);
var q = (from s in Session.DB.PoolUsers
where s.PoolQID == a
select s);
var qq = (from c in q
group c by c.PoolAID into agroups
select agroups.Key);
var qqq = (from c in qq
select c).Count();
MessageBox.Show(qqq.ToString());
还有我的课程:
public partial class PoolA //For answers
{
public int Id { get; set; }
public string Answer { get; set; }
public string QuestionID { get; set; }
}
public partial class PoolQ //Questions
{
public int Id { get; set; }
public string Question { get; set; }
public string AnswerID { get; set; }
public string Status { get; set; }
public string StartDate { get; set; }
public string EndDate { get; set; }
}
public partial class PoolUser //resaults
{
public int Id { get; set; }
public int PoolQID { get; set; }
public int PoolAID { get; set; }
public int UserID { get; set; }
}
答案 0 :(得分:0)
我不知道你的意图,但我认为你应该重新设计架构(不是因为它不可行)以获得最大效率。您将PoolUser表称为结果表,但它最好是您的答案日志。您需要一个已经处理过结果的表格,例如在DWH类型的情况下进行处理。
如果您有结果汇总表,您可以整天计算垂直汇总组,而无需为临时数据连接表等的额外性能。我认为你要经常运行这个结果,所以听起来最好存储报告,性能等的汇总信息。
关于问题的当前状态:
var qq = (from c in q
group c by c.PoolAID into agroups
select agroups.Key);
agroups的answerIds按您输入的问题编号分组。 然后你只是显示分组答案的行数,显示你2:
var qqq = (from c in qq
select c).Count();
你告诉我你的消息框显示数字“2”
这意味着人们只选择了两个选项来回答您输入的任何问题ID。您不知道答案是否正确。你有最后一个查询“qqq”,你有外面的计数,所以它只返回行数。你不想要行数。你想要分组后的answerID计数。
from c in qq
select count(c)
这是您输入的questionID的总答案。
现在您需要正确的答案才能计算百分比。这是缺少的查询。你已经走了75%的路。完成它。希望这是足够的细节,而不是太多的文字阅读。
答案 1 :(得分:0)
这不是我做的最佳方式,我会高度考虑你,改变你的实体。
以下是解决方案:
int questionId = 1;
var questionAnswers = list.Where(elem => elem.PoolQID == questionId);
int questionAnswersCount = questionAnswers.Count();
var answersPrecentage = questionAnswers
.GroupBy(elem => elem.PoolAID)
.ToDictionary(grp => grp.Key, grp => (grp.Count() * 100.0 / questionAnswersCount));
答案 2 :(得分:0)
问题解决了,我得到了以下代码。我还绘制了基于
的图表 private void button1_Click(object sender, EventArgs e)
{
var list = (from c in Session.DB.PoolUsers
select c).ToList();
int questionId = Convert.ToInt32(textBox1.Text);
var questionAnswers = list.Where(elem => elem.PoolQID == questionId);
int questionAnswersCount = questionAnswers.Count();
var answersPrecentage = questionAnswers
.GroupBy(elem => elem.PoolAID)
.ToDictionary(grp => grp.Key, grp => (grp.Count() * 100.0 / questionAnswersCount));
dataGridView1.DataSource = answersPrecentage.ToArray();
//Draw Chart From DataGridview:
chart1.DataBindTable(answersPrecentage);
}
并且工作正常 谢谢大家:))