2016-08-23 4 views
3

Warum gibt die single wo query ein anderes Ergebnis als multiple where queries?dynamic linq multiple vs single .where query

query.Where("666 = ID"); 
query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate); 

query.ToString(); Ergebnisse in:

SELECT * 
    FROM [Country] AS [Extent1] 
    WHERE 666 = [Extent1].[ID] 

und die gleiche Abfrage mit mehreren wo

query = query.Where("ActiveFrom < @0", toDate); 
query = query.Where("ActiveTo > @0", fromDate); 
query = query.Where("ValidFrom < DateTime.Now"); 
query = query.Where("ValidTo > DateTime.Now"); 

Ergebnisse in ruft:

SELECT * 
FROM [Country] AS [Extent1] 
WHERE (666 = [Extent1].[ID]) AND 
([Extent1].[ActiveFrom] < convert(datetime2, '2016-10-23 11:40:35.9538054', 121)) AND 
([Extent1].[ActiveTo] > convert(datetime2, '2016-06-23 11:40:35.9518052', 121)) AND 
([Extent1].[ValidFrom] < (SysDateTime())) AND 
([Extent1].[ValidTo] > (SysDateTime())) 
+1

nicht sicher, ob es eine dumme Frage, aber der Code, den Sie geschrieben ... im ersten Beispiel - haben Sie Abfrage gesetzt = "zuerst wo" und dann wieder für die zweite wo? –

+2

'query.Where (" 666 = ID ");' tut nichts, weil Sie diese Abfrage keiner Variablen zuweisen, während Ihr zweites Beispiel dies tut. –

Antwort

2

Um für die verschiedenen Where s relevant sein, müssen Sie sie zurück zu query zuweisen: kann

//instead of: 
query.Where("666 = ID"); 
query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate); 

//do: 
query = query.Where("666 = ID"); 
query = query.Where("ActiveFrom < @0 && ActiveTo > @1 && ValidFrom < DateTime.Now && ValidTo > DateTime.Now", toDate, fromDate); 

Auch die Where Anrufe verkettet werden. Die meisten Linq-Erweiterungsmethoden geben IEnumerable<TSource> zurück und können daher verkettet werden.

Anwendung der Verkettungs auf Ihre zweite Abfrage es wie folgt aussehen:

query = query.Where("ActiveFrom < @0", toDate) 
      .Where("ActiveTo > @0", fromDate) 
      .Where("ValidFrom < DateTime.Now") 
      .Where("ValidTo > DateTime.Now"); 
1

Da die Anrufe die Abfrage ändern nicht , sie retten Geben Sie stattdessen eine neue Instanz ein, die die geänderte Abfrage darstellt. So führt das zweite Beispiel zu der großen Abfrage, während das erste zu einer einfachen where-Bedingung führt.