Вам понадобится:
- Поиск по каждой таблице
- Преобразовать результаты в общий тип
- Слияние результатов
- Сортировать / выбрать из этого объединенного списка
- Возьмите первые 50 результатов.
Первые два можно сделать с помощью LINQ to Entities, последние три - с помощью LINQ to Objects.
РЕДАКТИРОВАТЬ Этот подход будет выглядеть примерно так:
var resA = from a in db.A
where ConditionA(a)
select MakeSharedFromA(a);
var resB = from b in db.B
where ConditionB(b)
select MakeSharedFromB(b);
var resC = from c in db.C
where ConditionC(c)
select MakeSharedFromC(c);
var resD = from d in db.D
where ConditionD(d)
select MakeSharedFromD(d);
var merged = resA.AsEnumerable().Take(50)
.Concat(resB.AsEnumerable().Take(50))
.Concat(resC.AsEnumerable().Take(50))
.Concat(resD.AsEnumerable().Take(50));
var res = merged.Sort(x => x.SortField).Take(50);
Если каждый из методов MakeSharedFromX
может быть заменен лямбда-выражением (для создания дерева выражений), которое ограничено операторами и функциями, поддерживаемыми LINQ to Entities, тогда отбрасывайте вызовы AsEnumerable
и Take
из Шаг конкатенации и все может быть выполнено на стороне сервера.