EF Code First: Как искать по нескольким таблицам / сущностям? - PullRequest
0 голосов
/ 29 октября 2011

У меня есть 4 несвязанных объекта, и я хотел бы запросить их для определенного ключевого слова.У каждой сущности было поле LastModified, и я хотел бы вернуть 50 лучших результатов поиска по порядку 4 таблиц по полю LastModified.Возможно ли это вообще?

В прошлом я использовал вид для такого рода вещей ... но я не понимаю, как этого добиться с EF Code First .

1 Ответ

7 голосов
/ 29 октября 2011

Вам понадобится:

  • Поиск по каждой таблице
  • Преобразовать результаты в общий тип
  • Слияние результатов
  • Сортировать / выбрать из этого объединенного списка
  • Возьмите первые 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 из Шаг конкатенации и все может быть выполнено на стороне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...