2
StudentID 会话学期主题

1 2012 1 1
1 2012 1 2
1 2012 1 3
1 2012 1 4
1 2012 1 5
1 2012 2 6
1 2012 2 7
1 2012 2 8
1 2012 2 9
1 2012 2 10
1 2013 2 1
1 2013 2 13
1 2013 2 14
1 2013 2 15
1 2013 2 16
1 2013 3 17
1 2013 3 18
1 2013 3 19
1 2013 3 20
1 2013 3 21

我不知道我可以命名我想要生成的查询。我搜索了很多,但找不到任何结果。
我想要做的是编写一个查询,它可以帮助我选择第 1,2 和 3 学期的记录,但要排除不同会话的同一学期的记录。具体来说(我想检索2012年的第一学期和2013年的第二学期和第三学期)。

未指定的会话和学期重复此操作。

4

4 回答 4

1

这是在 Linqpad 中:

var tuples = new[] {
Tuple.Create(1, 2012, 1, 1),
Tuple.Create(1, 2012, 1, 2),
Tuple.Create(1, 2012, 1, 3),
Tuple.Create(1, 2012, 1, 4),
Tuple.Create(1, 2012, 1, 5),
Tuple.Create(1, 2012, 2, 6),
Tuple.Create(1, 2012, 2, 7),
Tuple.Create(1, 2012, 2, 8),
Tuple.Create(1, 2012, 2, 9),
Tuple.Create(1, 2012, 2, 10),
Tuple.Create(1, 2013, 2, 1),
Tuple.Create(1, 2013, 2, 13),
Tuple.Create(1, 2013, 2, 14),
Tuple.Create(1, 2013, 2, 15),
Tuple.Create(1, 2013, 2, 16),
Tuple.Create(1, 2013, 3, 17),
Tuple.Create(1, 2013, 3, 18),
Tuple.Create(1, 2013, 3, 19),
Tuple.Create(1, 2013, 3, 20),
Tuple.Create(1, 2013, 3, 21)};
tuples
    .GroupBy(t => t.Item3)
    .Select (g => g.Where(x => x.Item2 == g.Max (x1 => x1.Item2)))
    .Dump();

因此,您将获得一个学期中最高年份的学期。

输出:

Item1 Item2 Item3 Item4 
1 2012 1 1 
1 2012 1 2 
1 2012 1 3 
1 2012 1 4 
1 2012 1 5 

Item1 Item2 Item3 Item4 
1 2013 2 1 
1 2013 2 13 
1 2013 2 14 
1 2013 2 15 
1 2013 2 16 

Item1 Item2 Item3 Item4 
1 2013 3 17 
1 2013 3 18 
1 2013 3 19 
1 2013 3 20 
1 2013 3 21 
于 2013-05-09T13:47:10.840 回答
1

我不知道该查询要表示什么,但您当然可以使用 LINQ 来实现该结果。

Where将帮助您缩小结果并SelectMany帮助您加入多个序列。

var studentData = ...; // your table of data

var studentId = ...; // student Id

var requestedRecords = new [] 
    {
        new { Session = 2012, Semester = 1 },
        new { Session = 2013, Semester = 2 },
        new { Session = 2013, Semester = 3 },
    };

var query = requestedRecords.SelectMany(
                rr => studentData.Where(
                          ss => ss.StudentID == studentId
                             && ss.Session == rr.Session 
                             && ss.Semester == rr.Semester)
            );
于 2013-05-09T13:39:34.667 回答
0

我认为您需要在这里进行自我加入。您将首先要进行分组并获得每个会话/学期组合的最小(会话),然后您希望将此结果与完整表再次加入会话和学期。

这是LINQ 示例的非常好的资源。我手头没有我的LINQpad,否则我会为你敲一些东西。

我通常不会推荐产品,但 LINQPad 在设计 LINQ 查询甚至 C# 片段的原型时是一种美感。

SQL 将如下所示:

SELECT
    *
FROM
    Course AS C
    INNER JOIN
    (
        SELECT
            MIN(IC.Session),
            IC.Semester
        FROM
            Course AS IC
        GROUP BY
            IC.Session,
            IC.Semester
    ) AS Q ON C.Session = Q.Session AND C.Semester = Q.Semester
于 2013-05-09T13:23:55.690 回答
0

LINQ“除外”方法

我想您可能对LINQ 'Except' 方法感兴趣。

于 2013-05-09T13:29:36.097 回答