2013-11-21 249 views
0

我已經在SQL中創建請求並將它們放入數據集中。顯然當數據非常巨大時它會掛起。所以我使用一個實體。sql到linq與左連接

我原來的SQL是這樣的:

SELECT NO_ORDRE,ORDRE.CODE_DEST as CODE_DEST,REF_EXPED,ORDRE.MODAL_MODE,RS_NOM,ADRESSE,TEL,VILLE, 
ORDRE.NBR_COLIS,ORDRE.POID,DATE_CREE,DATE_CLOTUR,STATUT_ORDRE,ORDRE.TRANSPORTEUR,ORDRE.LIB_TOURNE, 
ORDRE.DATE_CLOTUR_REEL,ORDRE.OBS,AUTRE_REF, 
ORDRE.CODE_CLIENT+'_'+CAST(NOID as VARCHAR(50))+'_'+SUBSTRING(NO_ORDRE_CUMMUL, 0, CHARINDEX('_', NO_ORDRE_CUMMUL + '_')) as NOLV 
FROM ORDRE 
LEFT OUTER JOIN LETTRE_VOIT_FINAL 
ON charindex('_'+cast(ORDRE.NO_ORDRE as varchar(255))+'_', '_'+LETTRE_VOIT_FINAL.NO_ORDRE_CUMMUL+'_') > 0 

WHERE DATE_CREE BETWEEN @DATE_CREE_DEB AND @DATE_CREE_FIN 
ORDER BY NO_ORDRE DESC 

,我盡我的LINQ這樣的:

public IQueryable<ORDRE> Get_OrdreEntity(DateTime datedeb, DateTime datefin) 
     { 
      try 
      { 
       IQueryable<ORDRE> LesListe; 
       Soft8Exp_ClientEntities oEntite_T = new Soft8Exp_ClientEntities();    

       var query = from o in oEntite_T.ORDRE 
          where o.DATE_CREE >= datedeb && o.DATE_CREE <= datefin        
          select o; 

       LesListe = query; 

       return LesListe; 
      } 
      catch (Exception excThrown) 
      { 
       throw new Exception("Err_02", excThrown); 
      } 
     } 

它工作得很好,但我不知道如何從這個SQL聯接:

LEFT OUTER JOIN LETTRE_VOIT_FINAL 
ON charindex('_'+cast(ORDRE.NO_ORDRE as varchar(255))+'_', '_'+LETTRE_VOIT_FINAL.NO_ORDRE_CUMMUL+'_') > 0 

和我怎樣才能從這個SQL轉換爲LINQ:

ORDRE.CODE_CLIENT+'_'+CAST(NOID as VARCHAR(50))+'_'+SUBSTRING(NO_ORDRE_CUMMUL, 0, CHARINDEX('_', NO_ORDRE_CUMMUL + '_')) as NOLV 
+0

也許如果你的數據會很大,你可以使用一個視圖?它會帶來比使用框架更多的優勢嗎? –

回答

0
  1. 我看不到任何理由在Get_OrdreEntity函數中有異常處理。應該按照它的工作方式進行編碼。調試它。無論如何,你什麼也不做。
  2. 我在這個函數中查詢和過濾數據,並希望得到結果,在此函數的結果中返回集合而不是查詢是一個好主意,以消除性能和副作用。即返回IEnumerable,ICollection,IList,你想要什麼。
  3. 很容易找到一大堆Linq加入示例,只需使用Google即可。 Here is所有你需要的。