【问题标题】:Refactoring C# code - doing more within Linq重构 C# 代码 - 在 Linq 中做更多事情
【发布时间】:2009-04-23 23:38:59
【问题描述】:

下面的代码是我目前拥有的并且工作正常。我觉得我可以在 Linq 而不是 C# 代码中做更多我正在做的工作。

有没有人可以用更多的 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 对象,然后像这样在 foreach 循环中设置 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&lt;Survey_Question&gt;,这样 q.Survey_Questions[?] 集合中只有一项。

下面是我的数据库架构和业务对象架构

【问题讨论】:

  • 链接是 C#。不知道你为什么要区分

标签: c# linq refactoring


【解决方案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()),
        };
    }

【讨论】:

    【解决方案2】:
    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
    }
    

    这会让你走上正轨吗?

    【讨论】:

      【解决方案3】:

      为什么要复制所有课程?您可以使用您的业务逻辑扩展 LINQ to SQL 类 - 它们是部分类。这有点违背 OR 映射器的目的 - 持久化业务实体。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 2014-05-27
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多