2014-02-14 79 views
0

我有兩個表。任命和黑名單。當我向客戶發佈消息時,我把他的客戶名稱作爲黑名單表的外鍵。如果存在於其他表中,則返回bool值

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


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

這裏CusId被引用到客戶。我想要的是,當我使用預約表中的約會ID進行搜索時,如果與該約會相關的客戶在黑名單表中,則返回true,否則返回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(); 

但是,如果你有一個導航屬性您AppointmentBlacklist實體之間建立起來,這是更簡單。你可以做這樣的事情:

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()) 

else:

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)} 
相關問題