2013-09-23 46 views
3

我必須創建一個LINQ查詢加入3 IEnumerable(2數據表,一個列表)。我也必須「外接」我的2個連接。C# - LINQ - 2種風格之間的查詢

我真的很喜歡第二個,因爲更多的可聽和可比的SQL。但是我面臨的性能問題(延長了3倍)與之前的第一次相比,可讀性較差,但速度更快。

有人可以向我解釋我能做些什麼來優化第二個查詢,爲什麼他們有很大的不同,但是返回相同的數據(我是LINQ的新手,並且很難理解每個LINQ- TO-SQL /λ/ SAMBA subtilities

舊人,真快,但不太lisible

var Detailled_payroll = 
     from MainData in dt_BasicPayrollData.AsEnumerable() 
      //joining (Externalize later...) with a list of days 
      join MyDays in gdt_Liste_JourFérié 
       on MainData.Field<DateTime>("DENTREE") equals MyDays 
        into MyDays_join //why? 
      //joining (Externalize later...) with a list (datatable) of things 
      join MyFilter in gdt_MyFilter.AsEnumerable() 
       on MainData.Field<string>("KEY") equals MyFilter.Field<string>("KEY") 
        into MyFilter_join //why? 

      //I think we "outer join" here, forcing the existing of a missing join        
      from MyDays in MyDays_join.DefaultIfEmpty() 
      from MyFilter in MyFilter_join.DefaultIfEmpty() 

      let tmp = MainData.Field<string>("CEmploye") //dont remember why.. 

      select new Blabla() 
      { 
       EmpNumber=MainData.Field<string>("NoEmploye"), 
       IsInSpecialDays = MyDays == Default(DateTime) ? "NO" : "YES", 
       KeyWasFound = MyFilter == null ? "NO" : "YES" 
      } 

這裏是 「新」 的一個:

var Detailled_payroll = 
     from MainData in dt_BasicPayrollData.AsEnumerable() 
     //joining (and externalize...) with a list (datatable) of things 
     from MyFilter in MyGlobalVariable.gdt_FiltreEnCours.AsEnumerable() 
      .Where(x => x.Field<string>("KEY") == MainData.Field<string>("KEY")) 
      .DefaultIfEmpty() 
     //joining (and externalize...) with a list (List<DateTime>) of days 
     from MyDays in gdt_Liste_JourFérié 
      .Where(x => x == MainData.Field<DateTime>("DENTREE")) 
      .DefaultIfEmpty() 

     select new Blabla() 
      { 
       EmpNumber=MainData.Field<string>("NoEmploye"), 
       IsInSpecialDays = MyDays == Default(DateTime) ? "NO" : "YES", 
       KeyWasFound = MyFilter == null ? "NO" : "YES" 
      } 
  • 「舊」查詢以3秒的時間返回結果。
  • 「新」查詢以10秒的時間返回結果。

兩者具有完全相同的結果數據。

任何想法?

+0

回答你的'爲什麼?' - 因爲你想執行左連接。 –

+1

第二個是不是第三個交叉連接,其中第一個是左連接? –

回答

4

總之,在第一你加入,第二你你過濾它具有笛卡兒積然後。

+0

這不只是一個字。但這是正確的答案。 – Servy

+0

@Servy也許有人需要更詳細的解釋。 –

+3

我不是說它應該是一個單詞的釋放,我只是說你的「一個字」導致...是不準確的。 – Servy