【问题标题】:Which kind of join should i use? [EF4.0 code first ]我应该使用哪种联接? 【EF4.0代码优先】
【发布时间】:2015-09-04 20:28:33
【问题描述】:

我为糟糕的主题标题道歉,因为我有点不知道我应该在这里做什么。

首先,这是我的数据库表设计,我希望在继续之前收到一些反馈:

我正在尝试制作一个注册网络应用程序。

主题

subject
[id] [subj]   [professor]  [cstart]  [cend]  [days]  [count] [units]
1   comalgo    carl        10:00am  12:30pm  M-W      40      3.0
2   compasm    carl        01:00pm  02:30pm  T-TH     40      3.0
3   compro     miguel      04:30pm  06:30pm  M-W      35      3.0
4   pro5       fua         03:30pm  05:30pm  T-TH     30      3.0
5   pro5       fua         06:30pm  08:30pm  F        10      3.0

学生

students
[id] [fname]   [lname]   [bday]       [unitsleft]  [unitstaken] [major]
 1    carlos    doe      11/20/1990      100           0         BS-COMPUTER SCIENCE
 2    miguel    doe      08/15/1992      100           0         BS-ECONOMY
 3    carl      doe      12/12/1991      100           0         BS-PSYCHOLOGY
 4    test      doe      02/12/1992      100           0         BS-LITERATURE

我打算做的是,科目将通过一系列列表呈现,学生将选择多个科目并注册。总注册单元不应大于 20 且小于 11。我已经实现了该部分,我现在正在存储选定的主题。

这是我提出的解决方案,我想收到一些关于它的反馈以及我应该使用什么操作。

我将为所有已注册的受试者提供一个集中的表格

注册科目

selected subject
[id] [subjid] [studentid] [status]
1       1        1           P     //comalgo enrolled by carlos, P is for pending grade
2       1        2           P     //comalgo enrolled by miguel  P is for pending grade
3       2        1           P     //compasm enrolled by carlos  P is for pending grade

我的计划是:我有一个学生个人资料页面,他们将能够专门为自己查看/编辑他们当前注册的科目(基于 ID)

我希望他们看到以下表格标题,这些表格标题来自已注册的科目:

[subj] [professor] [cstart] [cend] [days]

以下是我的问题的简要总结:

1.) 我的桌子好吗?或者这是一个糟糕的设计? 2.) 我应该使用什么样的方法?我正在尝试研究它(加入),但我有点困惑,需要澄清。我想向用户展示他们选择的主题。

编辑:我想我可以做类似的事情.. 从enrolled subjects 中选择 id = x 然后获取subject id 但我不确定这是否有效。

【问题讨论】:

    标签: mysql entity-framework linq asp.net-mvc-4


    【解决方案1】:

    您的表格看起来不错(即第三范式)。一个 INNER 连接就可以了

    SELECT
        B.subj, B.professor, B.cstart, B.cend, B.days
    FROM
        selectedsubjects A
        INNER JOIN subjects B ON A.subjid = B.id
    WHERE
        A.studentid = 1
    

    附言这看起来像是学校的作业或书本上的东西......?

    【讨论】:

    • 哦,不,这只是一个测试自己的个人项目,我会尝试你所做的,感谢您的反馈和回答:D
    • 另外,如果我也想显示status 怎么办?
    【解决方案2】:

    可能是:

    var query =  context.EnrolledSubjects
       .Include("Subject")
       .Where(i => i.StudentId == 1)
       .Select(i => new {
          i.Subject.Subj,
          i.Subject.Professor,
          i.Subject.CsStart,
          i.Subject.Send,
          i.Subject.Days,
          i.Status
    };
    

    【讨论】:

    • 哦,太好了,谢谢。我稍后会尝试。这是上面帖子中的 lambda 等效项吗? Subject 是表名吧?
    • 是的,SubjectEnrolledSubject 上的导航属性。如果您有问题,请使用您的课程结构更新您的答案
    • 还有一件事,我需要创建另一个类来保存结果列表吗?因为我打算把它传给一个视图。
    • 没有必要。我创建了一个对象,但没有创建另一个类。看到我使用了varSelect。它将以匿名类型保存所有这些属性。见msdn.microsoft.com/en-us/library/bb397696.aspx。但是,如果您想在视图上传递结果,最好创建另一个类。
    猜你喜欢
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    相关资源
    最近更新 更多