2013-05-09 40 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