2010-08-06 444 views
0

我在其中一個實體框架應用程序中運行此代碼。我知道必須有比這個代碼執行的三個查詢更好(更有效)的方式。雖然,我無法完全理解語法。 (我仍然自己學習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(); 

回答

0

我認爲你可以用類似下面的查詢替換:

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 ?? -1) equals c.callID 
     where u1.callID == callID 
     select c; 

var result = query.ToList(); 
+0

我想試試。謝謝。 我想也可能有一些方法來利用每個表上的導航屬性。 (例如tblCalls有一個「Units」導航屬性,而tblUnits有一個「Call」導航屬性...) – Shayne 2010-08-06 18:10:37

+0

在這種情況下,你可能會消除第二次連接(到tblCalls)和'select u2.Call'。 – 2010-08-06 18:24:24

+0

那麼,你認爲這會起作用嗎? 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