2016-12-02 44 views
0

我有以下查詢從表中提取數據與不應存在於另一個表中的記錄。Linq優化與記錄不匹配的查詢從另一個表

該查詢工作正常,但需要太多時間&性能受到極大影響。

我可以對此查詢進行哪些更改以獲得更好的性能,還是應該以另一種方式進行此操作?

var data = (from A in ctx.tblMachine 
where 
    A.CompanyId == companyId && 
    A.InOutDate >= tempDt && 
    A.InOutDate <= toDate && 
!(from B in ctx.tblEntry 
where 
    B.CompanyId == companyId && 
    A.EmployeeId == B.EmployeeId && 
    A.InOutDate == B.EntryDate && 
    B.EntryMethod == "M" 
select new 
{ 
    B.EmployeeId 
}).Contains(new { EmployeeId = A.EmployeeId }) 
orderby 
A.EmployeeId, A.InOutDate select new 
{ 
    A.EmployeeId, 
    A.InOutDate, 
    A.InOutFlag, 
    A.InOutTime 
}).ToList(); 
+0

看到什麼查詢該生產和簡介它(嘗試重新在SQL中更快,請注意清除緩存)。之後,在linq中寫入更改。如果此結果應在頁面中使用,請跳過「跳過」以僅顯示記錄的可見部分。 – mybirthname

+0

我剛剛在SQL Server中轉換了上述查詢,當我跑到那裏時,它顯示了我1秒的結果。同樣的查詢,當我在LINQ中運行時間超過20分鐘。 – Anup

回答

1

您可以也湊,而不是內部查詢嘗試......你可以用這個方法使變化根據自己的需要..

var data = (from A in ctx.tblMachine 
     join B in ctx.tblEntry on A.EmployeeId == B.EmployeeId && 
            A.InOutDate == B.EntryDate && 
            B.CompanyId == companyId && 
            B.EntryMethod == "M" 
     where 
       A.CompanyId == companyId && 
       A.InOutDate >= tempDt && 
       A.InOutDate <= toDate && 
       !(B.EmployeeId).Contains(new { EmployeeId = A.EmployeeId }) 
     orderby 
     A.EmployeeId, A.InOutDate 
     select new 
     { 
      A.EmployeeId, 
      A.InOutDate, 
      A.InOutFlag, 
      A.InOutTime 
     }).ToList(); 
+0

感謝您的回答。請問你能否提供一些代碼。 – Anup

+0

查看我的更新回答.. –

相關問題