1

エクスポート用に「フラット化された」バージョンのデータを作成する必要があります。このバージョンでは、顧客は関連するテーブルの行を列として表示することを望んでいます。EntityFramework4と.NET4.0を使用しています

顧客は、イベントのカスタム質問を作成することができます。ゼロから無限の質問があるかもしれません。イベントに参加するユーザーは、これらの質問のいずれにも、一部またはすべてに答えることができます。

部分エンティティ図

私が作成する必要があるのは次のようなものです。

User 1    User 1 info field A   User 1 info field B    User 1 Answer to question A    User 1 Answer to Question B
User 2    User 2 info field A   User 2 info field B    User 2 Answer to question A    User 2 Answer to Question B

結果セットのユーザー情報部分を作成することは問題ではありませんが、関連する質問と回答を取得する方法に困惑しています。

from urf in tblUserRegistrationFields.Include("tblRegistrationFields")
where urf.UserID == eachUserID && urf.tblRegistrationField.EventID == thisEventID
select new
{
    FieldLabel = urf.tblRegistrationField.FieldLabel, //this is the question name
    value = urf.value //this is the user's answer
}

そして、それらを個々の列としてユーザーselectステートメントに追加します。

var users = from u in context.tblUsers
            <snip>
            select new
            {
                UserID = u.UserID,
                <snip>,
                CustomQuestionA = AnswerA,
                CustomQuestionB = AnswerB,
                ... etc.
            };

最終的には、グリッドを作成して、希望の形式にエクスポートできるようにする必要があります。非LINQソリューションを利用できます(ただし、サードパーティのコントロールを購入することはできません)。LINQのグループ化を活用する方法があると思います。機能はありますが、このシナリオには適用できませんでした。

4

1 に答える 1

0

SQL で動的ピボットを実行する方法を見つけましたが、関連する2 つのテーブルでは機能せず、1 つのテーブルでしか機能しませんでした。動的 SQL ピボットはこちら: http://www.simple-talk.com/blogs/2007/09/14/pivots-with-dynamic-columns-in-sql-server-2005/

最終的には、データセットを手動で作成することにしました。これは確かに最適化されたソリューションではありませんが、顧客が望むものを提供します。大量のデータにはこのアプローチをお勧めしません。

データセットとデータテーブルの固定列を作成し、質問のリストをループします。

//get the list of questions
var context = new EventRegistrationEntities();
var customQuestions = from rf in context.tblRegistrationFields
                      where rf.EventID == vEventID
                      select new
                      {
                          RegistrationFieldID = rf.RegistrationFieldID,
                          FieldLabel = rf.FieldLabel
                      };

//add a question column for each question
List<string> extracolumns = new List<string>();

foreach (var q in customQuestions)
{
    dt.Columns.Add(q.FieldLabel, typeof(string));

    //store the question names for later user
    extracolumns.Add(q.RegistrationFieldID.ToString() + "-" + q.FieldLabel.ToString());
}

次に、ユーザーのリストをループして固定データを挿入し、そのループ内で (うーん) ユーザーの回答を追加します。

foreach (var c in extracolumns) //these are the custom *questions*
{
    int regID = Convert.ToInt32(c.Substring(0, c.IndexOf("-")));
    string question = c.Substring(c.IndexOf("-") + 1); //we need to pass the question text (aka column header) in because if the user hasn't answered the question we have no access to it from here

    //get the question answer
    var userAnswer = (from urf in context.tblUserRegistrationFields.Include("tblRegistrationFields")
                      where urf.UserID == u.UserID && urf.RegistrationFieldID == regID
                      select new
                      {
                          Question = urf.tblRegistrationField.FieldLabel,
                          Answer = urf.value
                      }).FirstOrDefault();

     //add the answer to the data row
     if (userAnswer != null)
     {
         dr[question] = userAnswer.Answer.ToString();
     }
     else
     {
         dr[question] = ""; //if the user has not answered the question, insert a blank
     }
 }
于 2012-11-12T18:17:41.263 に答える