ciao,
vailfox ha scritto:
e questo solo su IIS 7. Sul Web Server integrato di VS2010 non ho il problema.
Non so... a me sembra molto strano. Sia IIS che l'Asp.Net development server usano entrambi lo stesso runtime di Asp.Net. La query SQL che viene generata dal provider LINQ è la medesima.
Ad ogni modo, prova a leggere questo articolo che illustra le differenze tra i due webserver, magari ti salta all'occhio qualcosa.
http://www.asp.net/web-forms/tutorials/deployment/core-differences-between-iis-and-the-asp-net-development-server-csvailfox ha scritto:
Ad ogni modo mi sarebbe piaciuto capire perché utilizzando LastOrDefault ottengo questo strano comportamento...
Ok, ci provo. Penso di aver capito qualcosa in più quando ho letto questa riga:
Dim cs As EventLog = Me.EventLog.OrderByDescending(Function(d) d.ID).FirstOrDefault
Se poggi il mouse sulla proprietà di navigazione EventLog, noterai che è una collezione di tipo
EntityCollection<EventLog>.
Questo tipo di collezione NON implementa IQueryable quindi ogni extension method come LastOrDefault che tu possa usare su di essa non andrà a far parte dell'espressione LINQ. Non dovendo essere "tradotto" in SQL, non ottieni un'eccezione.
Quindi il LastOrDefault andrà in esecuzione solo dopo che il provider avrà effettuato una query per ottenere TUTTI gli EventLog, e solo dopo che le entità si saranno materializzate nel contesto.
vailfox ha scritto:
| Device | EventLog a caso
| Device | ultimo EventLog
Questo problema si verifica perché Sql Server, nel recuperare tutti gli eventlog, non ti garantisce che l'ultimo da te inserito sia effettivamente l'ultimo che ti risulta nella lista.
Cito da qui:
http://msdn.microsoft.com/en-us/library/ms188385.aspx
The order in which rows are returned in a result set are not guaranteed unless an ORDER BY clause is specified.
Quindi, usare l'extension method .OrderBy è comunque indicato se vuoi assicurarti che i risultati ti siano forniti nell'ordine voluto.
Chiarito questo aspetto, resta un'altra cosa in sospeso: il fatto che l'accesso alla proprietà di navigazione .EventLog vada a materializzare tutte le entità, mentre a te ne serve una sola. Quello che puoi fare è usare il metodo
.CreateSourceQuery per ottenere un IQueryable da .EventLog. E' molto semplice:
Dim cs As EventLog = Me.EventLog.CreateSourceQuery().OrderByDescending(Function(d) d.ID).FirstOrDefault
Così dovrebbe essere ok anche dal punto di vista delle prestazioni.
In chiusura, vorrei fare due considerazioni marginali sulla classe Device, ma si fa per parlare...
Select Case Me.CurrentStatus.StatusEnum
Case EnumDeviceStatus.Successful
Return "~/Images/Ok-256.png"
Case EnumDeviceStatus.Failed
Return "~/Images/Error-256.png"
Nelle classi di dominio, prova a non introdurre delle proprietà come
StatusImage che riguardano strettamente la presentazione dei dati.
Potresti cavartela semplicemente con StatusEnum: stampala nell'html, come valore dell'attributo class. Esempio:
<div class="status Successful">Titolo del device</div>
Poi, dal CSS, definisci l'immagine come sfondo della div. Ad esempio protresti fare (ovviamente adattalo alle tue esigenze):
.status.Successful {background-image:url('Images/Ok-256.png'); background-position:left; background-repeat:no-repeat;}
L'altra cosa riguarda la proprietà CurrentStatus. Teoricamente, come ho appreso l'altro ieri al .Net Campus, nelle classi di dominio dovresti scrivere solo logica invariante. Cioè, data una stessa istanza di Device, il CurrentStatus restituito dovrebbe essere
sempre lo stesso. Invece, in questo caso, il CurrentStatus cambia in base alla data/ora corrente, che è cablata all'interno della proprietà.
Potresti, ad esempio, convertire la proprietà CurrentStatus in un metodo GetCurrentStatus(DateTime dataora), così esponi la sua dipendenza da una data/ora. Oppure, ancor meglio, estrai tutta questa logica in un extension method o in un servizio. Lo scopo è quello di mantenere snelle le classi di dominio e relegare altrove la logica della loro interazione col "mondo esterno" o con altre classi di dominio.
ciao
Modificato da BrightSoul il 23 aprile 2012 22.19 -