[英]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.Name
和Course.Id
初始化程序。 假設User
的構造函數沒有對CourseTutor
和Course
進行任何花哨的初始化,更正的代碼將起作用。
即使數據庫中沒有外鍵,也沒有理由不能在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.