2017-04-08 8 views
0

最終的には基本的な.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開発者ではない。どんな助けでも大歓迎です。

答えて

0

Iは、<Question>タイプのヌル可能なメンバーの明示的なコンストラクタによってこの問題を解決することができたので、同様にDeafultIfEmptyため<Choice>の新しいインスタンスを供給する:

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 string Heading { get; set; } 
    public bool? Visible { get; set; } 
    public bool? ForcedRanking { get; set; } 
    internal string Href { get; set; } 
    public QuestionAnswers Answers { get; set; } 
    public string Nickname { get; set; } 

    public Question() 
    { 
     Answers = new QuestionAnswers(); 
    } 
} 

public class QuestionAnswers 
{ 
    public List<Choice> Choices { get; set; } 
    public OtherAnswer Other { get; set; } 

    public QuestionAnswers() 
    { 
     Choices = new List<Choice>(); 
    } 
} 



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(new Choice()) 
        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>(); 
関連する問題