2014-02-14 5 views
0

У меня есть две таблицы. Назначение и черный список. Когда я вставляю клиента, я помещаю его cusId в качестве внешнего ключа в таблицу черного списка.Возвращаемое значение bool, если оно существует в другой таблице

Appointment 
------------ 
(AppId,Time,CusId) 


Blacklist 
----------- 
(CusId,date) 

Здесь CusId ссылается на Заказчика. То, что я хочу, - это когда я просматриваю идентификатор встречи в таблице «Назначение», если клиент, имеющий отношение к этой встрече, находится в таблице черного списка, верните true else false.

Я новичок в EF. Пожалуйста, помогите мне решить этот вопрос. Спасибо заранее.

ответ

2
int appId = 10; // appID to check 

bool ifBlackListed = BlackList.Any(r=> r.CusID == 
             Appointment.First(t=> 
                 t.AppId == appId) 
                .CusId); 

Я не уверен, что SQL-запрос будет генерироваться против него, но вы можете получить CustId от назначения сначала, а затем сравните его в BlackList, что может избавит вас от отправки дополнительного поискового запроса на каждой итерации BlackList.Any:

int custID = Appointment.First(t=> t.AppId == appId).CusId; 
bool ifBlackListed = BlackList.Any(r=> r.CusId == custID); 

Кроме того, если вы ожидаете null назад от вашего первого запроса (против назначения) затем использовать FirstOrDefault и сверять null перед обращением CusId

+1

Спасибо за ответ. Я внес некоторые изменения .. и он работает сейчас. Благодарю. – Daybreaker

+0

@Daybreaker, приветствую вас, я не уверен, какой запрос будет создан против него, но вы можете извлечь 'Appointment.First (t => t.AppId = appId) .CustId', а затем сравнить его с' BlackList', что позволит сохранить дополнительный поиск на каждой итерации. – Habib

2

Запрос, как это должно работать:

bool isBlacklisted = 
    (from a in dbContext.Appointments 
    join b in dbContext.Blacklist on a.CusId equals b.CusId 
    where a.AppId = appointmentId 
    select b) 
    .Any(); 

Но если у вас есть свойство навигации установить между вашим Appointment и Blacklist лиц, это еще проще. Вы могли бы сделать что-то вроде этого:

bool isBlacklisted = 
    (from a in dbContext.Appointments 
    where a.AppId = appointmentId 
    select a.Blacklist.Any()) 
    .First(); 

или, возможно, даже это:

bool isBlacklisted = dbContext.Appointments.Find(appointmentId).Blacklist.Any(); 
+0

Спасибо за ответ. Предыдущий ответ сработал для меня. – Daybreaker

0

Если внешние ключи и юридические лица могут быть сконфигурированы правильно:

from a in Appointment 
//where a.CustId == customerId //if you want to pass a customer id 
select new {Appointment = a, IsBlackListed = a.Customer.BlackList.Any()) 

прочее:

from a in Appointment 
//where a.CustId == customerId //if you want to pass a customer id 
select new {Appointment = a, IsBlackListed = BlackList.Any(b=>b.CustId == a.CustId)} 
Смежные вопросы