我在其中一個實體框架應用程序中運行此代碼。我知道必須有比這個代碼執行的三個查詢更好(更有效)的方式。雖然,我無法完全理解語法。 (我仍然自己學習Entity Framework ..)實體框架查詢
有兩個表參與。這是一個簡單的父母/子女關係。
有一個呼叫表,其中包含有關我們所有呼叫的信息,並且有一個單位表包含分配給每個呼叫的單個序列號(單位)。請注意,這不是一個多對多的關係。單位表可以/將包含重複記錄(序列號)!
一個調用在Units表中可以有0-多個子記錄。
因此,當呼叫者呼入時,我們的客戶代表會輸入一個序列號(總是在單位表中創建一個新記錄),將其與此呼叫相關聯。此時我們填入「通話記錄」選項卡。該標籤由下面的查詢構建。 (搜索單位表並查找與此單位匹配的所有單位,然後返回分配給所有這些單位(記錄)的所有呼叫。)
總結。查詢的目標是:根據呼叫ID,在數據庫中查找任何其他呼叫,這些呼叫也與分配給此呼叫的任何序列號綁定。
考慮到實體框架在名爲「Categories」的tblCall表中創建了一個導航,而在名爲「Call」的tblCategory表中,必須有更好/更有效的方式來編寫此查詢。我真的很想重構它。 :)
下面是現有的查詢:
//First, get all the Serial Numbers assigned to this Call.
var serials = from units in context.tblUnits
where units.callID == callID
select units.unitSerialNumber;
List<string> serialsList = serials.ToList<string>();
//Get all of the Call IDs that are assigned to any of the serial numbers from the list above
var callIDs = from units in context.tblUnits
where serialsList.Contains(units.unitSerialNumber)
select units.callID;
List<int> callIDList = callIDs.ToList<int>();
//Return all of the calls that are in the callID list from above
var data = from calls in context.tblCalls
where callIDList.Contains(calls.callID)
select calls;
result = data.ToList<tblCall>();
任何意見得多apprecaited!
感謝您的幫助Daniel。下面是最終的查詢:
var query = (from u1 in context.tblUnits
join u2 in context.tblUnits on u1.unitSerialNumber equals u2.unitSerialNumber
join c in context.tblCalls on u2.callID equals c.callID
where u1.callID == callID
select c).Distinct();
result = query.ToList();
我想試試。謝謝。 我想也可能有一些方法來利用每個表上的導航屬性。 (例如tblCalls有一個「Units」導航屬性,而tblUnits有一個「Call」導航屬性...) – Shayne 2010-08-06 18:10:37
在這種情況下,你可能會消除第二次連接(到tblCalls)和'select u2.Call'。 – 2010-08-06 18:24:24
那麼,你認爲這會起作用嗎? var query = from u1 in context.tblUnits join u2 in context.tblUnits on u1.unitSerialNumber equals u2.unitSerialNumber where u1.callID == 1 select u2.Call; var result = query.ToList(); 「u1.callID == 1」的用途是什麼? – Shayne 2010-08-09 13:06:30