2009-09-21 3 views
0

Я отчаянно пытаюсь использовать LinqKits PredicateBuilder, чтобы позволить пользователю вводить поисковый запрос в текстовое поле и возвращать записи из двух таблиц базы данных/сущностей, но я изо всех сил пытаюсь добраться где угодно. (Упрощенная) структура базы данных выглядит следующим образом:Запрос двух разных типов сущностей с использованием PredicateBuilder

Person    Alias 
------    ------ 
         A_ID 
P_ID ---------------< P_ID 
P_FIRST_NAME   A_FIRST_NAME 
P_SURNAME    A_SURNAME 

Таким образом, каждый человек может иметь 0 или несколько псевдонимов. То, что я пытаюсь сделать, это позволить пользователю выполнить поиск по имени и оттянуть строки из таблицы Person, где это имя совпадает с таблицей Person или Alias. До сих пор у меня есть:

 var peopleQuery = MainFrm.genesisContext.People.AsExpandable(); 
     var peoplePredicate = PredicateBuilder.True<Person>(); 

     var aliasQuery = MainFrm.genesisContext.Alias.AsExpandable(); 
     var aliasPredicate = PredicateBuilder.False<Alias>(); 

     if (!String.IsNullOrEmpty(txtFirstName.Text.Trim())) 
     { 
      peoplePredicate = peoplePredicate.And(p => p.P_FIRST_NAME == txtFirstName.Text); 

      aliasPredicate = aliasPredicate.And(a => a.A_FIRST_NAME == txtFirstName.Text); 

      peoplePredicate = peoplePredicate .Or(p => aliasPredicate); 
     } 

Это не работает, потому что я пытаюсь преобразовать из People в Alias. В принципе я полностью застрял и не уверен, что это вообще возможно сделать запрос или на два разных таблицах

ответ

1

Я могу думать о нескольких возможных решениях (?):

  1. включает первичное имя каждого человек в таблице Алиас, и просто поиск по таблице Алиас или
  2. UNION две таблицы вместе до поиска или
  3. Выполнить запрос Linq, что внешние соединения таблицы псевдонимов в таблицу Person, и использовать результат т в вашем поиске, включая ваше условие ИЛИ
+0

Как бы я сделал внешнее соединение в linq? Я думал, что внешние соединения невозможны? – Calanus

+0

Имитация внешнего соединения: http://www.hookedonlinq.com/OuterJoinSample.ashx –

+0

Спасибо, В итоге я использовал оператор Linq Union для объединения двух наборов результатов ... – Calanus