2015-07-17 3 views
0

Я недавно начал использовать Simple.Data в качестве своего ORM. Я столкнулся с проблемой фильтрации по столбцу из объединенной таблицы.Фильтровать по столбцу из таблицы

Мой запрос выглядит следующим образом:

var candidates = db.dbo.Candidates 
      .FindAllBy(CommonOfferId: commonOfferId, CandidateId: null) 
      .Select(
       db.dbo.Candidates.Id, 
       db.dbo.Candidates.Email, 
       db.dbo.CandidateProfiles.CandidateId 
      ).LeftJoin(db.dbo.CandidateProfiles).On(db.dbo.Candidates.Id == db.dbo.CandidateProfiles.CandidateId); 

Я хочу, чтобы выбрать объекты, которые не имеют идентификаторов в другой таблице. Этот код не работает. Я получаю исключение, что Candidates не имеет колонки CandidateId.

Есть ли способ отфильтровать этот запрос по значению из объединенной таблицы?

ответ

0

Это почти правильно:

dbo.Candidates 
     .FindAllBy(CommonOfferId: commonOfferId, CandidateProfiles.CandidateId: null) 
     .Select(
      db.dbo.Candidates.Id, 
      db.dbo.Candidates.Email, 
      db.dbo.CandidateProfiles.CandidateId 
     ).LeftJoin(db.dbo.CandidateProfiles).On(db.dbo.Candidates.Id == db.dbo.CandidateProfiles.CandidateId); 
+0

Я уже пробовал это. Он не компилирует –

+0

Работает ли он для вас? –

+0

Не могли бы вы показать модель базы данных? – Luc

0

Если у вас есть внешние ключи, определенные в базе данных между Candidates и CandidateProfiles таблиц и это левое соединение, я думаю, вы могли бы просто написать (не проверено):

db.dbo.Candidates 
    .FindAllBy(CommonOfferId: commonOfferId) 
    .Where(db.dbo.Candidates.CandidateProfiles.CandidateId==null) 
    .Select(
     db.dbo.Candidates.Id, 
     db.dbo.Candidates.Email); 

Главной недостающей частью в вашем коде был .Candidates перед .CandidateProfiles. Вот как вы выражаете левые соединения в Simple.Data, и вы можете присоединиться к нескольким уровням таким образом. Это очень выразительно, и IMHO это одна из лучших функций Simple.Data.