3

3 つの IEnumerable (2 つのデータ テーブル、1 つのリスト) を結合する LINQ クエリを作成する必要がありました。また、2 つの結合を「外部結合」する必要があります。

SQL に比べてはるかに信頼性が高く、匹敵するので、私は 2 番目のものを本当に気に入っています。しかし、私はパフォーマンスの問題 (3 倍長い) に直面しています。

誰かが私に2番目のクエリを最適化するために何ができるか、またなぜそれらが非常に異なっているのに同じデータを返すのかを説明してもらえますか(私はLINQが初めてで、すべてのLINQ-TO-SQL/を理解するのに苦労しています) LAMBDA/SAMBA のサブティリティ

古いもの、本当に速いですが、あまり信頼できません

 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 秒ほどで結果を返します。

どちらもまったく同じ結果データを持っています。

何か案は?

4

1 に答える 1

4

つまり、最初に結合し、2 番目にデカルト積を取得し、それをフィルタリングします。

于 2013-09-23T20:53:03.330 に答える