StudentID Session Semester Subject 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年第2和第3学期)。
使用未指定的会话和学期重复此操作。
答案 0 :(得分: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)
);
答案 1 :(得分: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
答案 2 :(得分:0)
我认为你需要在这里进行自我加入。您将首先要为每个会话/学期组合执行分组并获取分钟(会话),然后您希望将此结果与全表再次加入会话和学期。
这是a very good resource for LINQ samples。我手上没有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
答案 3 :(得分:0)
LINQ'除了'方法强>
我想你可能对LINQ 'Except' method感兴趣。