3.5 VS 4.0 .NET Framework - PullRequest
       1

3.5 VS 4.0 .NET Framework

3 голосов
/ 27 февраля 2011

5 фреймворк, не использующий внешний ключ отношения в базе данных, и мне интересно, как 4.0 может улучшить этот мусор кода, который мне нужен, чтобы передать несколько объектов после нескольких объединений таблиц.

  public IList<User> GetTutorByCourseId(int courseId)
    {
        IList<User> output = new List<User>();
        using (leDataContext db = new leDataContext())
        {
            try
            {
                var m = from c in db.Courses
                        join ct in db.CourseByTutors on c.Id equals ct.CourseId
                        join u in db.Users on ct.TutorId equals u.Id
                        where c.Id == courseId
                        select new
                        {
                            c, ct, u
                        };

                foreach (var result in m)
                {
                    User user = new User();
                    user.Id = result.u.Id;
                    user.Name = result.u.Name;
                    user.CourseTutor.Id = result.ct.Id;
                    user.Course.Name = result.c.Name;    
                    output.Add(user);
                }
                return output;
            }
            catch (Exception ex)
            {
                Logger.Error(typeof(User), ex.ToString());
                throw;
            }
        }
    }

Там3 объекта возвращаются вызывающей стороне в графическом интерфейсе.Однако, чтобы сделать это, мне нужно добавить свойство public CourseByTutors {get; set} и общедоступный курс (get; set;) в классе User, который, как я обнаружил, испортит мой код.В таком случае, как бы 4.0 смог решить эту проблему?я читал что-то о выборе тупел .. ??

Ответы [ 3 ]

3 голосов
/ 27 февраля 2011

Что насчет этого (в 3.5)?

select new User
{
    Id = u.Id,
    Name = u.Name,
    CourseTutor = new CourseTutor {Id = ct.Id},
    Course = new Course {Name = c.Name}
};
return m.ToList();

РЕДАКТИРОВАТЬ: Заменены незаконные CourseTutor.Name и Course.Id инициализаторы.Исправленный код будет работать, если предположить, что конструктор User не выполнил причудливую инициализацию CourseTutor и Course.

2 голосов
/ 27 февраля 2011

Даже если у вас нет внешних ключей в базе данных, нет никаких причин, по которым вы не можете добавить отношения в вашу модель EF.Это поможет упростить проблему, поскольку вам не придется создавать дополнительные свойства для хранения ваших дочерних значений;CourseTutor, CourseName и т.д ..

Здесь могут помочь как 3.5, так и 4.0, хотя, по моему опыту, в 4.0 это намного проще.1005 *

var results = (from u in db.Users
        where u.Course.Id == courseId
        select u).ToList();
return results;

Надеюсь, это поможет.

0 голосов
/ 27 февраля 2011

Способ, которым я обычно справляюсь с этим, состоит в том, чтобы иметь отдельную модель от моих сущностей данных для GUI, которая включает в себя только ту информацию, которая необходима GUI.Вы можете сделать это в 3.5, если хотите.

public class TutorViewModel
{
     public IEnumerable<User> Tutors { get; set; }
     // the pair CourseId, UserId is the relation in CourseTutors so we only
     // need to keep it once, not once per user.
     public int CourseId { get; set; } 
     public string CourseName { get; set; }
}



public TutorViewModel GetTutorByCourseId(int courseId)
{
    var model = new TutorViewModel { CourseId = courseId };

    using (leDataContext db = new leDataContext())
    {
        try
        {
            model.CourseName = db.Courses
                                 .First( c => c.CourseId == courseId )
                                 .Name;
            model.Users = db.CourseByTutors
                            .Where( c => c.Id == courseId )
                            .Join( db.Users,
                                   c => c.TutorId,
                                   u => u.Id,
                                   (c,u) => u );

            return model;
        }
        catch (Exception ex)
        {
            Logger.Error(typeof(User), ex.ToString());
            throw;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...