2012-08-25 17 views
8

Mam następujące wyrażenie linq. Chcę obliczyć sumę wartości liczbowych w polu Nvarchar. W tym celu używam następującego kodu. Ale pojawia się błąd, gdy próbuję to uruchomić.Int.Parse w wyrażeniu Linq

 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(); 

błędu Opis:

LINQ jednostki nie zna metody 'Int32 składni (system.string) metoda' i metoda ta nie może być tłumaczony do ekspresji magazynu

Jak mogę rozwiązać ten problem i napisać c ode lepiej niż to?

mogę zmienić kod do tego

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(); 

ale ten błąd enter image description here

+0

Być może ta odpowiedź pomoże ci: [Konwertuj ciąg na int w EF 4.0] (http://stackoverflow.com/questions/5754218/convert-string-to-int-in-ef-4-0) –

Odpowiedz

4

Nie można użyć int.parse w where. Można przepisać zapytanie tak:

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(); 

połączeń .ToList() metoda, a następnie użyć int.Parse(variable).

Miłego dnia.

+2

, ale klauzula where zostanie wykonana poza bazą danych! –

+2

Lepiej używać 'AsEnumerable', aby uniknąć tworzenia listy pośredniej. – juharr

4

W swojej klauzuli WHERE, nie można nazwać int.Parse. Entity Framework nie wie, jak przekonwertować to do SQL. Zastanów się nad poprawieniem swojego Where.

+3

jak aby rozwiązać ten problem, proszę, daj mi rozwiązanie. dzięki – Pouya

6

Wymień wszystkie swoje int.Parse przez SqlFunctions.StringConvert(variable). Nie ma funkcji do zamiany ciągu na Int. Powinieneś spróbować zrobić odwrotność i przekonwertować Int do String za pomocą StringConvert.

Programy narzędziowe SqlFunctions będą w stanie przetłumaczyć polecenie w poleceniu SQL.

+0

Czy to nie będzie odwrotnie, i konwertować liczby na ciągi? –

+0

Zmieniam int.parse na SqlFunctions.StringConvert (zmienna), ale pojawia się błąd i edytuję pytanie. proszę pomóż mi. dzięki – Pouya

+0

Jakiego rodzaju jest tranDate? –

6

Entity Framework nie może przetłumaczyć tego rodzaju konwersji na SQL.

Czy istnieje możliwość zmiany struktury danych w celu użycia właściwych typów danych, takich jak rzeczywiste typy DateTime? W przypadku dużych ilości danych takie konwersje będą miały wpływ na wydajność.

Zalecam zmianę typów modeli danych, aby uniknąć tych konwersji, lub , jeśli ilość danych zawsze będzie mała, następnie najpierw pobierz dane, a później użyj Linq do obiektów.

-1

Istnieje źle zbudowana baza danych, której nie mogę edytować, ale muszę jej użyć.

Używam tego w Linq-To-Sql i to działa.

Najpierw odrzuć łańcuch do obiektu, a następnie przesuń go do wnętrza.

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:

Zamiast int.Pasrse użycie Convert.ToInt32. Entity Framework wygeneruje odpowiednie funkcje SQL w postaci CAST.

EF 6:

Krótka odpowiedź:

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

Długa odpowiedź:

w EF 6 trzeba przekonwertować wartość numeryczną na łańcuch z SqlFunctions.StringConvert. ale ma problem. Doda niepotrzebne spacje do wyniku. więc porównanie się nie powiedzie. Właśnie dlatego umieściłem tam Trim(). Przetestowałem to z EF 6.1.1.

+0

Czy ktoś może to potwierdzić? Dla mnie to nie działa (EF 6.1.0) – arni

+0

@arni. Zobacz moją edycję. – Mahmoodvcs

+4

Pytanie dotyczy parsowania łańcucha znaków na int, a nie odwrotnie. – arni