【问题标题】:simplify linq to sql returning multiple object简化 linq to sql 返回多个对象
【发布时间】:2011-03-20 10:29:45
【问题描述】:

好的,我不得不承认,直到现在我仍然不知道使用 linq to sql 返回多个对象的最佳方法。

 public IList<Course> GetAllStudentCourses()
    {
        IList<Course> output = new List<Course>();
        using (lenDataContext db = new lenDataContext())
        {
            var result =
                 from ct in db.CourseByTutors
                 join c in db.Courses on ct.CourseId equals c.Id
                 join u in db.Users on ct.TutorId equals u.Id
                 select new
                 {
                     c,
                     u,
                 };
            foreach (var r in result)
            {
                Course course = new Course();
                course.CourseByTutor = new CourseByTutor();
                course = r.c;
                course.IsGroupString = (r.c.IsGroup == 1) ? "Yes" : "No";
                course.User = r.u;

                output.Add(course);
            }
        }
        return output;
    }

我想将 Course 和 User 对象返回给 UI。

 private void InitializeData()
    {
        Course c = new Course();
        dgCourses.AutoGenerateColumns = false;

        bs.DataSource = c.GetAllStudentCourses().ToList();          

        dgCourses.DataSource = bs; //bs is bindingsource
    }

如何显示用户数据,例如给 Gridview 命名? 我已将 User.Name 放入 datapropertyName 但它仍然没有显示任何内容。 我的 Course.User 有价值。

【问题讨论】:

  • 是的,我如何将一些用户属性显示回我的 GV(Gridview),因为我将对象返回为
  • 您的架构中没有定义 CourseByTutors -> Course 和 CourseByTutors -> User 之间的关系吗?这就是你在查询中加入他们的原因吗?
  • 是的,我没有定义关系。我在我的 UI 中尝试了这个,Course c = new Course(); GVCourse.datasource = c.GetAllStudentCourses().ToList();然后我将 Gridview dataPropertyName 设置为 c.User.Name 和 Course.User.Name 但两者都没有显示我的名字
  • 你试过“User.Name”(没有课程部分)吗?
  • @Joel Gauvreau:我什至尝试只将 User.Name 放到 dataproteprtyName 中,但它可以告诉我任何东西。

标签: c# linq-to-sql


【解决方案1】:

如果您返回 db.CourseByTutors,您应该可以同时访问用户和课程。您在上面执行的两个内部连接似乎并不重要,因为您应该能够通过 EntitySet 访问它们。只需使用导航属性即可访问所有用户和课程。

public IQueryable<CourseByTutors> GetAllStudentCourses()
{
    lenDataContext db = new lenDataContext();
    return db.CourseByTutors;
}

然后在您的网格视图中,您可以通过 Coures.property 和 Users.property 在数据绑定列上引用属性。但是,您不能使用 using 语句,因为一旦返回 IQueryable,您就会处理数据上下文。

【讨论】:

    【解决方案2】:

    您可以通过将对象包装在另一个对象中来展平您的对象:

    public class CourseDisplay
    {
       private Course course; 
    
       public CourseDisplay(Course course)
       {
           this.course = course;
       }
    
       public string CourseName 
       { 
           get { return course.Name; } 
       }
    
       public string UserName 
       { 
           get { return course.User.Name;} 
       }
    }
    

    绑定到ObjectListView中的子属性更简单。

    【讨论】:

    • 是的,但我尽量不要添加额外的属性,因为它会带来更多的混乱
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多