最終的には基本的な.netの質問ですが、少しの背景があります:SQL Server Integration Servicesスクリプトコンポーネントを使用して調査サルの残りのAPIからデータを取得しようとしています。これはSSISのスクリプトタスクで発生しているため、GACにヘルパーライブラリを登録することは選択肢ではないため、サードパーティ製のライブラリとSSISツールがあります。明らかに、これはこれを行う理想的な方法ではありませんが、私は今のところこだわっています。私は問題なしでjsonデータを引き出すことができます。各データは、タイプ<SurveyDetail>
のオブジェクトにデシリアライズされ、そのタイプのリストに追加されます。クラス:linqを「非正規化」リストに変換すると、デシリアライズされたjsonが平坦化されます
public class SurveyDetail
{
public long? Id { get; set; }
public string Title { get; set; }
public string Nickname { get; set; }
public string Category { get; set; }
public string Language { get; set; }
public int? Question_Count { get; set; }
public DateTime? Date_Created { get; set; }
public DateTime? Date_Modified { get; set; }
public List<Page> Pages { get; set; }
}
public class Page
{
public List<Question> Questions { get; set; }
}
public class Question
{
public long? Id { get; set; }
public string Title { get; set; }
public QuestionFamily? Family { get; set; }
public List<Headings> Headings { get; set; }
public QuestionAnswers Answers { get; set; }
}
public class Headings
{
public string Heading { get; set; }
}
public class QuestionAnswers
{
public List<Choice> Choices { get; set; }
}
public class Choice
{
public long? Id { get; set; }
public string Text { get; set; }
}
のでList<SurveyDetail>
与え、私はDBにステージングを容易にするためList<SurveyQuestionOption>
にそれを平らにしたい:
public class SurveyQuestionOption
{
public long? SurveyID { get; set; }
public string SurveyTitle { get; set; }
public DateTime? DateCreated { get; set; }
public DateTime? DateModified { get; set; }
public long? QuestionID { get; set; }
public string QuestionTitle { get; set; }
public string QuestionType { get; set; }
public string QuestionText { get; set; }
public long? AnswerOptionID { get; set; }
public string AnswerOptionText { get; set; }
}
つまずきが<QuestionAnswers>
オブジェクトでその事実のようです<Question>
はnullになることがありますが、私の目標はこの場合に<SurveyQuestionOption>
にnullを持つことですが、これを実行しようとするとヌル参照の例外が発生します:
List<SurveyQuestionOption> flatData = new List<SurveyQuestionOption>();
flatData = (from s in surveyDetails
from p in s.Pages
from q in p.Questions
from h in q.Headings.DefaultIfEmpty()
from c in q.Answers.Choices.DefaultIfEmpty()
select new SurveyQuestionOption
{
SurveyID = s.Id == null ? null : s.Id,
SurveyTitle = s.Title == null ? null : s.Title,
DateCreated = s.Date_Created == null ? null : s.Date_Created,
DateModified = s.Date_Modified == null ? null : s.Date_Modified,
QuestionID = q.Id == null ? null : q.Id,
QuestionTitle = q.Title == null ? null : q.Title,
QuestionType = q.Family.Value.ToString(),
QuestionText = h.Heading.FirstOrDefault().ToString() == null ? null : h.Heading.FirstOrDefault().ToString(),
AnswerOptionID = c.Id == null ? null : c.Id,
AnswerOptionText = c.Text == null ? null : c.Text
}).ToList<SurveyQuestionOption>();
私は同様の質問がされていることを知っているが、私はまだ私の特定の状況のためのクエリを取得するために苦労しています。私は明らかに.net開発者ではない。どんな助けでも大歓迎です。