2010-03-11 15 views
11

Fondamentalmente, ho bisogno l'equivalente di T-SQL CONVERT(NVARCHAR(10), datevalue, 126)formato Linq 2 SQL DateTime a stringa yyyy-MM-dd

ho provato:

  1. from t in ctx.table select t.Date.ToString("yyyy-MM-dd") ma non tiri supportato eccezione
  2. from t in ctx.table select "" + t.Date.Year + "-" + t.Date.Month + "-" + t.Date.Day ma non penso che sia una soluzione utilizzabile, perché potrebbe essere necessario essere in grado di modificare il formato.

L'unica possibilità che vedo è quello di utilizzare Convert.ToString(t.Date, FormatProvider), ma ho bisogno di un provider di formato, e io non sono sicuro che funziona sia

formatProvider non work, String.Format non funziona (string.Format("{0:yyyy-MM-dd}", t.Date) non genera eccezioni supportate).

+0

Hai provato la versione '.AsEnumerable'? – AxelEckenberger

+0

Lo proverò oggi –

+0

Sotto la soluzione ha funzionato per me. Si prega di controllare sotto http://stackoverflow.com/questions/7999771/convert-datetime-to-a-formatted-string-inside-a-linq-to-sql-query –

risposta

6

Supponendo che t.Date è annullabile ( DateTime?) questo potrebbe essere il problema, provare a utilizzare:

from t in ctx.table select (t.HasValue ? t.Date.Value.ToString("yyyy-MM-dd") : string.Empty); 

Edit: OK, secondo tentativo ...

Il il problema è la traduzione in SQL che prova a tradurre .ToString() in una rappresentazione SQL e fallisce. Quindi, se si deve fare quanto segue dovrebbe funzionare:

(from t in ctx.table select t.Date).ToList().Select(d => d.ToString("yyyy-MM-dd"))

o

(from t in ctx.table select t.Date).AsEnumerable().Select(d => d.ToString("yyyy-MM-dd"))

AsEnumerable() trasforma la utilizza in precedenza IQueryable in un IEnumerable, fermando così la generazione di SQL (in caso di LINQ to SQL) o qualsiasi altra transazione da parte del fornitore che implementa lo specifico IQueryable (ad esempio, da Linq a SQL Provider).

Nota: prima di chiamare AsEnumerable() è necessario aver completato tutte le azioni che si desidera convertire in SQL ed eseguite direttamente nel database.

+0

La data non è annullabile. Inoltre, ToString non funziona con linq2sql su datetime. –

+0

Non è fattibile perché il conteggio delle righe è molto alto. –

+0

Quindi utilizzare la seconda opzione che ho inserito. – AxelEckenberger

3

C'è un motivo per eseguire la conversione sul lato del database? Ogni volta che mi imbatto in questo tipo di situazione, tendo a consentire semplicemente al database di darmi i dati grezzi e quindi eseguire il massaggio e la manipolazione all'interno dell'applicazione. A seconda del volume delle richieste al server del database e della dimensione del set di risultati, non voglio legare l'elaborazione e il tempo di risposta facendo conversioni di dati che possono essere gestite dal client.

+0

Ho bisogno di eseguire alcune string matching: Ho una stringa composta da alcune colonne 'nvarchar' e una colonna' datetime', e devo abbinarla con una colonna in un'altra tabella. –

+0

Posso vedere le strutture? –

7

Nel caso in cui qualcun altro abbia questo problema, ho risolto questo problema creando una funzione separata per eseguire la formattazione della data per me.

mio LINQ sembra qualcosa di simile:

from a in context.table 
where ... 
select new Class 
{ 
DateString = GetFormattedString(a.DateTimeObject) 
} 

E GetFormattedString solo restituisce DateTimeObject.ToString ("yyyy-MM-dd"); Questo funziona per me!

+0

Sono d'accordo. Sebbene ci siano molti modi per fare la conversione dopo che i risultati della query sono arrivati, passare il risultato nullable a un metodo mi sembra la soluzione più carina. +1 –

+1

Molto più bello di solo per questo scopo la ricerca di un oggetto intero nell'elenco. – Saulius

0

Provare a creare una classe oggetto che è possibile impostare le proprietà e lasciare che le proprietà siano il valore per la vista. Impostare i dati datetime da LINQ come stringa e non datetime .. es.

//Property class 
[DataContract()] 
public class Info 
{ 
[DataMember(Name = "created_date")] 
public string CreateDate; 
} 


//Controller 
var date = from p in dbContext.Person select p; 
CreateDate = Convert.ToDateTime(p.create_date).ToString("yyyy-MM-dd"); 

Spero che proverai questo .. Ho questo sulle mie passate applicazioni e questo è quello che ho fatto.

0

look no.3

var user = (from u in users 
        select new 
        { 
         name = u.name, 
         birthday = u.birthday.Value 
        }) 
        .ToList() 
        .Select(x => new User() 
        { 
         name = x.name, 
         birthday = x.birthday.ToString("yyyyMMdd") // 0埋めされるよ 
        }); 
-1

provare questo

var select = from s in db.Table 
      where s.date == someDate 
      select new 
      { 
       date = DateTime.Parse(s.date.ToString()).ToString("yyyy-MM-dd"), 
      }; 
+0

funziona effettivamente in linq2sql ma non funziona in EF throw LINQ to Entities non riconosce il metodo metodo 'System.String ToString (System.String)' .. – Jack0fshad0ws

Problemi correlati