Ich habe die folgenden Methoden:Methode Chaining in EF6 keine Ausgabe die richtige SQL
private IEnumerable<CTNTransactionsView> RetrieveCTNTransactionsNotInTLS() {
IQueryable<int> talismanIdCollection = this._cc.TLSTransactionView.Select(x => x.kSECSYSTrans);
return this._cc.CTNTransactionView
.Where(x => !talismanIdCollection.Contains(x.kSECSYSTrans));
}
public IEnumerable<CTNTransactionsView> RetrieveCTNTransactionsNotInTLSPast24Hours() {
DateTime previousDate = DateTime.Now.Date.AddDays(-1.0);
return this.RetrieveCTNTransactionsNotInTLS()
.Where(x => x.dSECSYSTimeStamp >= previousDate);
}
public IEnumerable<CTNTransactionsView> RetrieveCTNTransactionsNotInTLSPast24HoursVersionTwo() {
DateTime previousDate = DateTime.Now.Date.AddDays(-1.0);
IQueryable<int> talismanIdCollection = this._cc.TLSTransactionView
.Select(x => x.kSECSYSTrans);
return this._cc.CTNTransactionView
.Where(x => !talismanIdCollection.Contains(x.kSECSYSTrans))
.Where(x=> x.dSECSYSTimeStamp >= previousDate);
}
Aus irgendeinem Grund die Ausgabe SQL erzeugt durch Entity Framework 6 nicht die Ergebnisse entsprechen.
Die RetrieveCTNTransactionsNotInTLSPast24HoursVersionTwo() -Methode wird ordnungsgemäß eine SQL-Output-Anweisung geben, die Folgendes hat:
select ...... from ... where ... AND ([Extent1].[dSECSYSTimeStamp] >= @p__linq__0)}
Der andere hat nicht die Filter für die dSECSYSTimeStamp, wenn ich die SQL-Anweisung Ausgabe anzeigen.
Die Methoden, die ich vergleiche, sind die RetrieveCTNactionsNotInTLSPast24Hours() und die RetrieveCTNtransactionsNotInTLSPast24HoursVersionTwo().
Ich habe die SQL mit VS verglichen sowie eine Debug.Writeline() an das Database.Log im Kontext angehängt.
Vom Debuggen und Betrachten der SQL-Ausgabe scheint einer den Datumsfilter zu enthalten, während der andere nicht und doch beide das richtige Ergebnis liefert.
ich versucht habe, auf der SQL-Suche (durch Setzen von Breakpoints und zu sehen, die Ausgabe) aus mit dem folgenden:
System.Diagnostics.Debug.WriteLine("Running first method");
var result = this.repo.RetrieveCTNTransactionsNotInTLSPast24Hours();
var count = result.Count();
System.Diagnostics.Debug.WriteLine("Running Second method");
var resultTwo = this.repo.RetrieveCTNTransactionsNotInTLSPast24HoursVersionTwo();
var count2 = resultTwo.Count();
Ich bin mit EF 6.0.
Hinweis: Die Ergebnisse sind die gleichen wie beide genau dasselbe tun und das gleiche Ergebnis ausgeben. Allerdings bin ich neugierig und möchte gerne verstehen, warum das SQL Generated nicht das selbe ist?
Der Grund ist, dass LINQ nur LINQ to SQL verwendet, wenn es auf einem IQueryable verwendet wird. 'RetrieveCTNTransactionsNotInTLS' gibt ein IEnumerable zurück. Das bedeutet, dass es zu diesem Zeitpunkt die Daten in den Speicher lädt und dann die zweite Operation 'Where' für die Daten im Speicher ausführt ... nicht durch Ändern der SQL-Anweisung. – David784