2013-05-09 93 views
2
 
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)。

此操作重复未指定的会话和学期。使用LINQ查询排除特定记录

+0

你能写,你要检索,像上面表中的数据?我的意思是你可以写结果数据表吗? – 2013-05-09 13:23:35

+0

@AliRızaAdıyahşi我想选择2012年第1学期加上2013学期2和3 – 2013-05-09 13:29:58

+0

@AqilAzad:你为什么要这样做?鉴于表格,它为什么你需要这样做没有任何意义。 *用户*告诉你他们想要哪些年/学期?或者,这只是一个简单的例子:“我想要查询结果?” – user7116 2013-05-09 13:35:09

回答

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 
+0

我觉得我做了你所说的。即使SQL – 2013-05-09 13:28:36

+0

不幸结果不同,您也可以请写下您的查询 – 2013-05-09 14:05:02

+0

尝试MAX而不是MIN。我认为这应该把你排除在外。 – 2013-05-09 14:12:06

0

LINQ '除' 方法

我想你可能会感兴趣的LINQ 'Except' method

+0

谢谢,但我找不到查询来选择除外。我的意思是我无法查询2012年第2学期 – 2013-05-09 13:39:50

+0

除非事先知道需要排除什么,否则不行。我不认为这会在这里工作。 – 2013-05-09 13:46:37

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

这是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 
+0

这是我感觉的正确方法。 – 2013-05-09 14:16:31