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 秒ほどで結果を返します。
どちらもまったく同じ結果データを持っています。
何か案は?