使用LINQ查询排除特定记录

时间:2013-05-09 13:13:27

标签: asp.net-mvc linq

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学期)。

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

4 个答案:

答案 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感兴趣。