2012-08-25 16 views
8

Ho un'espressione linq seguente. Voglio calcolare la somma dei valori numerici nel campo Nvarchar. Io uso il seguente codice per fare questo. Ma ottengo un errore quando provo a eseguire questo.Int.Parse in Linq Expression

 var m = new MaterialModelContainer(); 

     var list = (from x in 
         (
          from inv in m.INVs 
          join l in m.LIBs on inv.MESC equals l.MESC 
          join o in m.OUTs on inv.MESC equals o.MESC 
          join t in m.TRANs on inv.MESC equals t.MESC 
          where t.TYPE == "60" 
          select new 
           { 
            l.MESC, 
            l.LINE_NO, 
            l.UNIT_LINE, 
            Description = l.DES + " " + l.PART_NO, 
            inv.NEW_QTY, 
            o.PJ, 
            o.DATE, 
            o.QTY, 
            o.QTY_REC, 
            TranQty = t.QTY, 
            tranDate = t.DATE 

           } 
         ) 
        group x by 
         new 
          { 
           x.MESC, 
           x.LINE_NO, 
           x.UNIT_LINE, 
           x.Description, 
           x.NEW_QTY, 
           x.PJ, 
           x.DATE, 
           x.QTY, 
           x.QTY_REC 
          } 
        into g 
        select new 
         { 
          QTY_Consum_1 = g.Where(c => int.Parse(c.tranDate) >= cuDate && int.Parse(c.tranDate) <= endDate).Sum(d => int.Parse(d.TranQty)) 

         } 
        ).ToList(); 

errore Descrizione:

LINQ to Entities non riconosce il metodo 'Int32 Parse (System.String)' metodo, e questo metodo non può essere tradotto in un'espressione negozio

come posso risolvere questo problema e scrivere questo c ode meglio di questo?

cambio il codice a questo

select new 
          { 
           QTY_Consum_1 = g.Where(c => SqlFunctions.StringConvert(c.tranDate) >= cuDate && SqlFunctions.StringConvert(c.tranDate) <= endDate).Sum(d => SqlFunctions.StringConvert(d.TranQty)), 
           g.Key.MESC 
          } 
         ).ToList(); 

ma ottengo questo errore enter image description here

+0

Forse questa risposta ti aiuterà: [Converti stringa in int in EF 4.0] (http://stackoverflow.com/questions/5754218/convert-string-to-int-in-ef-4-0) –

risposta

4

Non è possibile utilizzare int.parse in where. È possibile riscrivere la query come questa:

var list = (from x in 
       (
        from inv in m.INVs 
        join l in m.LIBs on inv.MESC equals l.MESC 
        join o in m.OUTs on inv.MESC equals o.MESC 
        join t in m.TRANs on inv.MESC equals t.MESC 
        where t.TYPE == "60" && t.QTY!="" 
        select new 
         { 
          l.MESC, 
          l.LINE_NO, 
          l.UNIT_LINE, 
          Description = l.DES + " " + l.PART_NO, 
          inv.NEW_QTY, 
          o.PJ, 
          o.DATE, 
          o.QTY, 
          o.QTY_REC, 
          TranQty = t.QTY, 
          tranDate = t.DATE 

         } 
       ).ToList() 
      group x by 
       new 
        { 
         x.MESC, 
         x.LINE_NO, 
         x.UNIT_LINE, 
         x.Description, 
         x.NEW_QTY, 
         x.PJ, 
         x.DATE, 
         x.QTY, 
         x.QTY_REC 
        } 
      into g 
      select new 
       { 
        QTY_Consum_1 = g.Where(c => int.Parse(c.tranDate) >= cuDate && int.Parse(c.tranDate) <= endDate).Sum(d => int.Parse(d.TranQty)), 
        g.Key.MESC 
       } 
      ).ToList(); 

chiamata .ToList() metodo, quindi utilizzare int.Parse(variable).

Buona giornata.

+2

ma la clausola where verrà eseguita al di fuori del database! –

+2

Meglio usare 'AsEnumerable' per evitare di creare la lista intermedia. – juharr

4

Nella clausola in cui, non si può chiamare int.Parse. Entity Framework non sa come convertirlo in SQL. Valuta la possibilità di rivedere il tuo Where.

+3

come per risolvere questo problema, per favore dammi una soluzione. grazie – Pouya

6

Sostituisci tutti i tuoi int.Parse entro il SqlFunctions.StringConvert(variable). Non c'è alcuna funzione per convertire String in Int. Dovresti provare a fare l'inverso e convertire il tuo Int in String con StringConvert.

Le utilità SqlFunctions saranno in grado di tradurre il comando nel comando SQL.

+0

Questo non fa il contrario e converte i numeri in stringhe? –

+0

ho cambiato int.parse in SqlFunctions.StringConvert (variabile) ma ottengo errore, modifico la domanda. mi aiuti per favore. grazie – Pouya

+0

Che tipo è transDate? –

6

Entity Framework non può convertire questo tipo di conversione in SQL.

C'è qualche possibilità che tu possa modificare la struttura dati per utilizzare tipi di dati appropriati come i tipi effettivi DateTime? Per conversioni di grandi volumi di dati, le conversioni del genere influenzeranno le prestazioni.

Si consiglia di modificare i tipi di modello di dati per evitare queste conversioni o se la quantità di dati sarà sempre piccola, quindi ottenere prima i dati e in seguito utilizzare Linq su Oggetti.

-1

C'è un database mal costruito, che non posso modificare, ma devo usarlo.

Lo uso in Linq-To-Sql e funziona.

Prima lanciare la stringa su oggetto, quindi lanciarla su int.

from s in db.Students 
select new 
{ 
    s.Name, 
    s.Surname, 
    Birthday = new DateTime((int)(object)(s.dateStr.Substring(0, 4)), 
          (int)(object)(s.dateStr.Substring(4, 2)), 
          (int)(object)(s.dateStr.Substring(6, 2))), 
} 
7

EF 5:

Invece di int.Pasrse uso Convert.ToInt32. Entity Framework genererà le corrette funzioni CAST in SQL.

EF 6:

Risposta breve:

youEntity.Where(c=>SqlFunctions.StringConvert((decimal?)c.INTFIELD).Trim() == STRINGVALUE) 

Risposta lunga:

in EF 6 si deve convertire il valore numerico in stringa con SqlFunctions.StringConvert. ma ha un problema. Aggiungerà spazi non necessari al risultato. quindi il confronto fallirà. Ecco perché ho messo Trim() lì. L'ho provato con EF 6.1.1.

+0

Qualcuno può confermarlo? Per me questo non funziona (EF 6.1.0) – arni

+0

@arni. Vedi la mia modifica. – Mahmoodvcs

+4

La domanda riguarda l'analisi della stringa su int, non viceversa. – arni