如何从多对一关系表中获得唯一记录

时间:2019-06-12 13:50:32

标签: asp.net-mvc linq entity-framework-5

我被困住了,找不到任何帮助。我想做的是通过 ID STUDENTS_DETAILS 表中获得唯一记录。 STUDENTS_DETAILS 表与 STUDENTS 有多对一关系。

var query = (from x in OracleDb.STUDENTS_DETAILS
             join y in OracleDb.STUDENTS on x.ID equals y.ID
             select new StudentViewModel()
             {
                 ID = x.ID,
                 APPLICATION_DATE = x.APPLICATION_DATE,
                 STUDENT_JOINED_DATE = y.STUDENT_JOINED_DATE,
                 SCHEME = y.SCHEME
             }).OrderByDescending(a => a.APPLICATION_DATE).ToList();

2 个答案:

答案 0 :(得分:1)

由于您在学生和STUDENTS_DETAILS之间存在一对多的关系,所以我认为学生的STUDENTS_DETAILS中的数据是不同的。

在这种情况下,对于STUDENTS_DETAILS表中的不同数据,同一学生记录将被加载多次。进行Distinct无效。您必须执行GroupBy

示例:

var results = from s in STUDENTS group s.Detail by s.ID into g select new { ID = g.Key, Details = g.ToList() };

对于以下数据:

 { ID = 1, APPLICATION_DATE = "2/2/2019", SCHEME = "A" }; 
 { ID = 1, APPLICATION_DATE = "2/2/2019", SCHEME = "B" }; 
 { ID = 2, APPLICATION_DATE = "3/2/2019", SCHEME = "C" }; 

由于SCHEME属性中的值,您将获得三行而不是两行。要使每位学生获得一行,您必须决定如何按ID以外的所有其他属性进行分组。例如获取最大长度数据和最大日期等。

答案 1 :(得分:1)

当您想要获得唯一记录时,您需要考虑其他因素,因为您可能有ID的重复记录,如本示例中的回复,如@ Rahatur 在他的回答中所述:

 { ID = 1, SCHEME = "A" }; 
 { ID = 1, SCHEME = "B" }; 

它们可能具有重复的ID记录,但是由于它们具有唯一的Scheme字段,所以它们是唯一的。那是你的考虑之一。现在,如果这与您所需的结果无关,而您只想获取记录的唯一ID,那么您可能想尝试一下:

var result = query.GroupBy(y => y.ID).Select(y => y.FirstOrDefault()).ToList();

这将获得序列的第一个元素,并确保记录集结果中具有唯一的ID