Non ha senso per me perché Linq2EF non si traduce in un vero .ToString()
SQL dichiarazione, come fa Linq2SQL, solo il Microsoft team di sviluppo conosce il motivo per cui non hanno ancora applicarla. :-(
Ma si può alzare la priorità per la sua attuazione, se si voto per questa funzione seguendo this link.
Per fortuna ci sono 2 soluzioni alternative disponibili anche, entrambi ho usato di recente in query EF:
I) ciò che mi ha aiutato a ottenere intorno a questa limitazione è stato quello di modificare la query in un elenco, in questo modo:
var customersList = (from c in db.Customers
select c).ToList(); // converts to IEnumerable<T> ...
var customersTest = (from c in customersList
select new {Id=c.ID.ToString()}); // ... which allows to use .ToString()
La dichiarazione .ToList()
convertiti IEnumerable<T>
, dove .ToString()
è disponibile. Note: che, a seconda dei requisiti, è possibile utilizzare anche .AsEnumerable()
, il che ha il vantaggio di supportare l'esecuzione differita che è meglio se si hanno più query di linq l'una a seconda dell'altra o se si utilizzano valori di parametro diversi (molti grazie a Divega per questo suggerimento!).
In seguito è possibile utilizzare questa query come si desidera, ad es .:
var customersTest2 = from c in customersTest
select new
{
Id = c.Id,
Addresses = from a in db.Addresses where c.Id == a.ReferenzId select a
};
Naturalmente, se avete bisogno è possibile aggiungere più proprietà agli oggetti di customersTest
come richiesto. Puoi anche ottimizzare la query sopra, ho solo usato 3 passaggi per la leggibilità di questo esempio.
II) Per le conversioni semplici, e se si dispone di riutilizzare la query generato in ulteriori subquery (ed è necessario rimanere IQueryable
), utilizzare SqlFunctions
da System.Data.Objects.SqlClient
, saranno tradotti in query SQL in modo corretto.
Esempio 1: Data di conversione (è necessario utilizzare dateparts come di seguito indicati)
var customersTest = from c in db.Customers
select new {
strDate=SqlFunctions.DateName("dd", c.EndDate)
+"."+SqlFunctions.DateName("mm", c.EndDate)
+"."+SqlFunctions.DateName("yyyy", c.EndDate)
}
Esempio 2: numerico alla conversione stringa
var customersTest = from c in db.Customers
select new {
strID=SqlFunctions.StringConvert((double)c.ID)
}
Questo dovrebbe aiutare sei fuori dalla maggior parte delle situazioni in cui sono richieste conversioni in stringhe.
Aggiornamento: Se hai seguito il link che ti ho dato all'inizio della mia risposta, questa caratteristica mancante ha nel frattempo ricevuto 75 voti ed è ora implemented by Microsoft in EF 6.1 (finalmente!). A tutti coloro che hanno partecipato: Grazie per aver votato! La tua voce è stata ascoltata.
Ad esempio:
var query = from e in context.Employees where e.EmployeeID.ToString() == "1" select e;
verrà ora tradotto a:
DECLARE @p0 NVarChar(1000) = '1'
SELECT [t0].[EmployeeID], [t0].[LastName], [t0].[FirstName], [t0].[Title],
[t0].[TitleOfCourtesy], [t0].[BirthDate], [t0].[HireDate], [t0].[Address],[t0].[City],
[t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[HomePhone], [t0].[Extension],
[t0].[Photo], [t0].[Notes], [t0].[ReportsTo], [t0].[PhotoPath]
FROM [Employees] AS [t0]
WHERE (CONVERT(NVarChar,[t0].[EmployeeID])) = @p0
cioè e.EmployeeID.ToString()
traduce (CONVERT(NVarChar,[t0].[EmployeeID]))
.
è l'ID di una stringa già? Non sono sicuro del motivo per cui l'EF potrebbe causare un problema, ma il messaggio di errore sembra indicare che si tratta di un ostacolo. Stringa di cose.ToString() funzionerebbe abbastanza rapidamente: P –
Id è un numero intero nell'esempio L2S. Nel nostro vero esempio EF è un GUID. È interessante notare che ToString() è in intellisense e compila ma ottiene quell'errore di runtime. –
@Edward Tanguay: ho appena visto la tua domanda e ho aggiunto una risposta, spero che sia ancora utile anche dopo così tanto tempo ... – Matt