Ich frage mich, warum Entity Framework eine solche ineffiziente SQL-Abfrage generiert. In meinem Code erwartete ich die WHERE auf das wirken, umfassen:Entity-Framework generiert ineffizientes SQL
db.Employment.Where(x => x.Active).Include(x => x.Employee).Where(x => x.Employee.UserID == UserID)
aber ich mit einem Doppel-SQL JOIN endete:
SELECT [x].[ID], [x].[Active], [x].[CurrencyID], [x].[DepartmentID], [x].[EmplEnd], [x].[EmplStart], [x].[EmployeeID], [x].[HolidayGroupID], [x].[HourlyCost], [x].[JobTitle], [x].[ManagerID], [x].[WorkScheduleGroupID], [e].[ID], [e].[Active], [e].[Address], [e].[BirthDate], [e].[CitizenshipID], [e].[City], [e].[CountryID], [e].[Email], [e].[FirstName], [e].[Gender], [e].[LastName], [e].[Note], [e].[Phone], [e].[PostalCode], [e].[TaxNumber], [e].[UserID]
FROM [Employment] AS [x]
INNER JOIN [Employee] AS [x.Employee] ON [x].[EmployeeID] = [x.Employee].[ID]
INNER JOIN [Employee] AS [e] ON [x].[EmployeeID] = [e].[ID]
WHERE ([x].[Active] = 1) AND ([x.Employee].[UserID] = @__UserID_0)
Ich fand heraus, dass diese Abfrage besser SQL schaffen:
db.Employment.Where(x => x.Active).Where(x => x.Employee.UserID == UserID)
SELECT [x].[ID], [x].[Active], [x].[CurrencyID], [x].[DepartmentID], [x].[EmplEnd], [x].[EmplStart], [x].[EmployeeID], [x].[HolidayGroupID], [x].[HourlyCost], [x].[JobTitle], [x].[ManagerID], [x].[WorkScheduleGroupID]
FROM [Employment] AS [x]
INNER JOIN [Employee] AS [x.Employee] ON [x].[EmployeeID] = [x.Employee].[ID]
WHERE ([x].[Active] = 1) AND ([x.Employee].[UserID] = @__UserID_0)
jedoch das Problem hier, die Entitäten referenziert werden nicht von der DB abgerufen.
Warum erzeugen zwei Codes nicht dieselben SQL?
Zuerst sollten Sie ihre Abfragepläne vergleichen - sie könnten identisch sein. –
Ich sehe den Punkt hier nicht, ich benutze EF als eine Abstraktionsschicht über SQL, wenn ich bis zum Abfrageplan gehen muss, könnte ich besser selbst SQL schreiben, anstatt EF es tun zu lassen. – Marko
Sie können beide Bedingungen in einer where-Methode kombinieren, indem Sie den Operator && nach dem Anwenden von Include verwenden. Das sollte eine andere Abfrage erzeugen. –