2009-04-23 5 views
1

以下のコードは私が現在持っているもので、うまく動作します。私はLinqでC#コードの代わりにやっている作業の多くを行うことができると感じています。C#Linqコードリファクタリング

Linqコードが多く、C#コードが少なくても同じ結果が得られる人がいますか?

public List<Model.Question> GetSurveyQuestions(string type, int typeID) 
    { 
     using (eMTADataContext db = DataContextFactory.CreateContext()) 
     { 
      List<Model.Question> questions = new List<Model.Question>(); 
      List<Linq.Survey_Question> survey_questions; 
      List<Linq.Survey> surveys = db.Surveys 
              .Where(s => s.Type.Equals(type) && s.Type_ID.Equals(typeID)) 
              .ToList(); 

      if (surveys.Count > 0) 
      {     
       survey_questions = db.Survey_Questions 
            .Where(sq => sq.Survey_ID == surveys[0].ID).ToList(); 

       foreach (Linq.Survey_Question sq in survey_questions) 
       { 
        Model.Question q = Mapper.ToBusinessObject(sq.Question); 
        q.Status = sq.Status; 
        questions.Add(q);       
       } 
      } 
      else 
      { 
       questions = null; 
      } 
      return questions; 
     } 
    } 

は、ここで私は私のマッパーfuncitonはそうのような質問の状態をマップするビズオブジェクト

internal static Model.Question ToBusinessObject(Linq.Question q) 
     { 
      return new Model.Question 
      { 
       ID = q.ID, 
       Name = q.Name, 
       Text = q.Text, 
       Choices = ToBusinessObject(q.Question_Choices.ToList())     
      };    
    } 

に私のエンティティからの私のマッパー機能です。

internal static Model.Question ToBusinessObject(Linq.Question q) 
    { 
     return new Model.Question 
     { 
      ID = q.ID, 
      Name = q.Name, 
      Text = q.Text, 
      Choices = ToBusinessObject(q.Question_Choices.ToList()), 
      Status = q.Survey_Questions[?].Status 
     }; 
    } 

問題は、この関数はステータスを取得する調査を知らないためです。代わりそう

foreach (Linq.Survey_Question sq in survey_questions) 
{ 
    Model.Question q = Mapper.ToBusinessObject(sq.Question); 
    q.Status = sq.Status; 
    questions.Add(q);       
} 

私は何とかコールを行うメソッドにおける上記q個のオブジェクトにEntitySet<Survey_Question>をフィルタリングしたいようなforeachループでStatusプロパティを設定次いでBIZオブジェクトを作成する

、そのような存在であろうとq.Survey_Questions [?]コレクション内のアイテムは1つだけです。以下

は私のデータベーススキーマとビジネス・オブジェクト・スキーマ alt text http://i41.tinypic.com/1051n28.png alt text http://i43.tinypic.com/awua2v.png

+0

リンク私のマッパー関数をオーバーロードするC#のです。なぜあなたがその区別をしているのか分かりません – Surya

答えて

1

私がする必要があったのは、参加をセットアップすることでした。その後、

public List<Model.Question> GetSurveyQuestions(string type, int typeID) 
    { 
     using (eMTADataContext db = DataContextFactory.CreateContext()) 
     { 
      return db.Survey_Questions 
        .Where(s => s.Survey.Type.Equals(type) && s.Survey.Type_ID.Equals(typeID)) 
        .Join(db.Questions, 
           sq => sq.Question_ID, 
           q => q.ID, 
           (sq, q) => Mapper.ToBusinessObject(q, sq.Status)).ToList(); 
     } 
    } 

とは

internal static Model.Question ToBusinessObject(Linq.Question q, string status) 
    { 
     return new Model.Question 
     { 
      ID = q.ID, 
      Name = q.Name, 
      Text = q.Text, 
      Status = status, 
      Choices = ToBusinessObject(q.Question_Choices.ToList()), 
     }; 
    } 
0
from question in db.Survey_Questions 
    let surveys = (from s in db.Surveys 
     where string.Equals(s.Type, type, StringComparison.InvariantCultureIgnoreCase) && 
     s.Type_ID == typeID) 
where surveys.Any() && 
surveys.Contains(s => s.ID == question.ID) 
select new Mapper.Question 
{ 
    ID = question.Id, 
    Name = question.Name, 
    Text = question.Text, 
    Choices = ToBusinessObject(question.Question_Choices.ToList()), 
    Status = question.Status 
} 

んが、あなたが正しい軌道に乗るのですか?

0

なぜあなたはすべてのクラスを複製していますか?ビジネスロジックを使用してLINQ to SQLクラスを拡張できます。これらは部分クラスです。これは、ORマッパーで持続するビジネスエンティティの目的には多少の違いがあります。