2009-04-23 4 views
1

Le code ci-dessous est ce que j'ai actuellement et fonctionne bien. Je pense que je pourrais faire plus du travail que je fais dans Linq au lieu du code C#.C# Code Linq Refactoring

Y at-il quelqu'un là-bas qui peut accomplir le même résultat avec plus de code Linq et moins de code 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; 
     } 
    } 

Voici ma fonction Mapper de mon entité à Biz Objet

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

Je veux que mon mappeur funciton à la carte de l'état de la question comme si.

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

? le problème est que cette fonction ne sait pas de quelle enquête tirer le statut.

Au lieu de créer l'objet biz puis définir la propriété d'état dans une boucle foreach comme si

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

Je voudrais filtrer en quelque sorte le EntitySet<Survey_Question> dans l'objet q ci-dessus dans la méthode d'appel, tel qu'il y aurait seulement un élément de la collection q.Survey_Questions [?].

ci-dessous est mon schéma de base de données et schéma objet métier alt text http://i41.tinypic.com/1051n28.png alt text http://i43.tinypic.com/awua2v.png

+0

est C#. Vous ne savez pas pourquoi vous faites la distinction – Surya

Répondre

1

Ce que je devais faire était de mettre en place une jointure.

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

Et puis surchargez ma Mapper Fonction

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()), 
     }; 
    } 
lien
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 
} 

Est-ce que vous obtenez sur la bonne voie?

0

Pourquoi dupliquez-vous toutes vos classes? Vous pouvez simplement étendre les classes LINQ to SQL avec votre logique métier - ce sont des classes partielles. Cela va un peu à l'encontre de l'objectif d'un mappeur OR - entités commerciales persistantes.