If you can implement a comparison such as IComparable<Exam>(which you can, for example, compare based on a key field such as ExamId), you could do it as shown below (showing an example using integers)
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = from item1 in array
from item2 in array
where (item1.CompareTo(item2) < 0)
select new Tuple<int, int>(item1, item2);
foreach (Tuple<int, int> tuple in query)
Console.WriteLine("{0}\t{1}", tuple.Item1, tuple.Item2);
Func<> inline , , .
Func<int, int, int> itemComparer = (x, y) => x.CompareTo(y);
var query = from item1 in array
from item2 in array
where itemComparer(item1, item2) < 0
select new Tuple<int, int>(item1, item2);
item2, , item1.
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = from item1 in array.Select((item, index) => new { item, index })
from item2 in array.Select((item, index) => new { item, index })
where (item1.index < item2.index)
select new Tuple<int, int>(item1.item, item2.item);
foreach (Tuple<int, int> tuple in query)
Console.WriteLine("{0}\t{1}", tuple.Item1, tuple.Item2);