簡體   English   中英

3.5 VS 4.0 .NET Framework

[英]3.5 VS 4.0 .NET Framework

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

在GUI中有3個對象返回給調用者。 但是,要做到這一點,我必須在User類中添加公共CourseByTutors {get; set}和公共課程(get; set;)的屬性,我發現它會弄亂我的代碼。 在這種情況下,4.0如何能夠解決這個問題? 我讀了一些關於選擇tupel的東西.. ??

這個怎么樣(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.NameCourse.Id初始化程序。 假設User的構造函數沒有對CourseTutorCourse進行任何花哨的初始化,更正的代碼將起作用。

即使數據庫中沒有外鍵,也沒有理由不能在EF模型中添加關系。 這將有助於簡化問題,因為您不必生成其他屬性來存儲子值; CourseTutor,CourseName等..

3.5和4.0都可以在這里提供幫助,但根據我的經驗,這在4.0中更容易。

一旦上面的代碼看起來像:

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

希望這可以幫助。

我通常會處理這種情況的方法是從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;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM