2009-04-23 71 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; 
     } 
    } 

這裏是我的實體我映射功能,以商務對象

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 
     }; 
    } 

問題是這個函數不知道從哪個調查中拉取狀態。

而不是創建的BIZ對象然後像設置Status屬性在foreach循環的這樣

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>以上,使得將有隻能是q.Survey_Questions [?]集合中的一個項目。

下面

是我的數據庫架構和業務對象模式 alt text http://i41.tinypic.com/1051n28.png alt text http://i43.tinypic.com/awua2v.png

+0

鏈接是C#。不知道你爲什麼這麼做 – Surya 2009-04-23 23:51:48

回答

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映射器持久化商業實體的目的。