我有一个问卷调查应用程序正在为我们的一个团队构建,并且在按他们的意愿制作报告时遇到了问题(如果可能的话)。我目前拥有的是:
var completedSurveys = (from s in db.SurveyResponses
join d in db.Demographics on s.SurveyID equals d.SurveyID into grpjoin
from d in grpjoin.DefaultIfEmpty()
select new
{
Survey_ID = s.SurveyID,
Survey_Date = s.Survey.SurveyDate,
Question = s.Questions.QuestionTxt,
Response = s.Responses.ResponseTxt,
Zip_Code = d.ZipCode,
Department = d.CityDepartments.Department,
Ace_Score = s.Survey.AceScore,
}).ToList();
在运行gridview / excel代码后产生的结果:
,他们想要的是一个Excel工作表,该工作表的“问题”列标题以及SurveyID,“日期”,“邮编”,“部门”和“分数”以及对问题的回答作为行数据,因此一切仅显示一次。像这样的excel表,我从其他地方得到的:
例如,我尝试了多种不同的分组方式
var completedSurveys = (from s in db.SurveyResponses
join d in db.Demographics on s.SurveyID equals d.SurveyID into grpjoin
from d in grpjoin.DefaultIfEmpty()
group new {s.Questions.QuestionTxt, s.Survey.SurveyDate } by new { s.SurveyID, s.Responses.ResponseTxt, d.ZipCode, d.CityDepartments.Department, s.Survey.AceScore } into g
orderby g.Key.SurveyID ascending
select new
{
Survey_ID = g.Key.SurveyID,
Survey_Date = g.Select(s => s.SurveyDate),
Response = g.Key.ResponseTxt,
Zip = g.Key.ZipCode,
Department = g.Key.Department,
Ace_Score = g.Key.AceScore
}).ToList();
但是我仍然没有得到想要的东西。如果我必须告诉他们我已经获得的一切都很好,那很好,但是我认为我至少会提出一些建议。任何帮助将不胜感激。
谢谢
答案 0 :(得分:0)
您的问题中有几个未知数,但是如果问题的关键是“如何在c#中旋转数据”,那么我有个好消息和个坏消息。好消息是它是可行的。坏消息是它并不漂亮。
首先,您需要按SurveyId将“ completedSurveys”分组:
var groupedSurveys =
completedSurveys
.GroupBy(g => g.Survey_ID);
然后创建一个您希望自己的行看起来像的类:
public class survey {
public int Survey_ID;
public DateTime date;
public int Zip_Code;
public int Ace_Score;
public string Q1;
public string Q2;
public string Q3;
}
然后,为此类对象创建一个主页:
var surveys = new List<survey>();
然后,在分组的调查中循环浏览分组。我们将其称为外循环。
在每个外部循环中:
此示例代码如下:
foreach (var surveyItems in groupedSurveys) {
var firstItem = surveyItems.FirstOrDefault();
var survey = new survey() {
Survey_ID = firstItem.Survey_ID,
date = firstItem.Survey_Date,
Zip_Code = firstItem.Zip_Code,
Ace_Score = firstItem.Ace_Score
};
foreach(var item in surveyItems) {
switch (item.Question) {
case "Text for question 1":
survey.Q1 = item.Response;
break;
case "Text for question 2":
survey.Q2 = item.Response;
break;
case "Text for question 3":
survey.Q3 = item.Response;
break;
}
}
surveys.Add(survey);
}
您将看到您的调查对象现在具有数据透视,每个调查都有一个“行”。
但是,这一切都不知道您的excel编写代码。将事物“标准化”并在此处进行解析可能更明智。您也可以考虑在服务器级别进行数据透视。数据透视语句可能会更友好一些。
此外,我不想切入您的逻辑来创建“ completedSurveys”。但是,只要您将其裁剪,就可以使它整体上看起来更优雅。