2013-05-09 2 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 года и 2 и 3 2013 года).

Это действие повторяется с неопределенным сеансом и семестром.Исключая конкретные записи, используя запрос LINQ

+0

Не могли бы вы написать данные, которые вы хотите получить, как выше таблицы? Я имею в виду, можно ли написать таблицу данных результата? –

+0

@ AliRızaAdıyahşi Я хочу выбрать семестр 1 2012 года плюс семестр 2 и 3 2013 года –

+0

@AqilAzad: почему вы хотите это сделать? Учитывая таблицу, не имеет никакого смысла, почему вы должны это делать. Является ли * пользователь * сообщим вам, какие годы/семестры они хотят? Или это просто простой случай: «Я хотел бы получить результаты этого запроса?» – user7116

ответ

0

Думаю, вам нужно сделать самостоятельное соединение здесь. Сначала вы захотите выполнить групповой сеанс и получить min (сеанс) для каждой комбинации сеанса/семестра, затем вы хотите присоединиться к этому результату, после чего полная таблица снова присоединяется к сеансу и семестру.

Адрес 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 –

+0

, к сожалению, результат отличается –

+0

Попробуйте MAX, а не MIN. Я думаю, это должно разобраться. –

0

LINQ 'За исключением' метода

Я думаю, что вы могли бы быть заинтересованы в LINQ 'Except' method.

+0

Спасибо, но я не смог найти запрос на выбор исключений для исключения. Я имею в виду, что я не мог запросить семестр 2 2012 года –

+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

Здесь в 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

Это правильный подход, который я чувствую. –

Смежные вопросы