我必須創建一個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秒的時間返回結果。
兩者具有完全相同的結果數據。
任何想法?
回答你的'爲什麼?' - 因爲你想執行左連接。 –
第二個是不是第三個交叉連接,其中第一個是左連接? –