2012-08-25 4 views
8

다음 linq 표현식이 있습니다. Nvarchar 필드에서 숫자 값의 합계를 계산합니다. 다음 코드를 사용하여이 작업을 수행합니다. 하지만 이걸 실행하려고하면 오류가 발생합니다.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(); 

오류 설명 : 엔티티

LINQ 메소드 'INT32 파싱 (선택 System.String)'방법 및이 방법을 인식하지 못하는 경우에는 점포 식으로 번역 할 수없는

는이 문제를 어떻게 해결하고이 C를 쓸 수 있습니다 이게 뭐니?

내가이

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

에 코드를 변경하지만 WHERE 절에이 오류 enter image description here

+0

아마도이 답변은 도움이 될 것입니다 : [EF 4.0에서 문자열을 int로 변환] (http://stackoverflow.com/questions/5754218/convert-string-to-int-in-ef-4-0) –

답변

4

where에서 int.parse를 사용할 수 없습니다. 이 같은 쿼리를 다시 작성할 수 있습니다 :

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

전화 .ToList() 방법은 다음 int.Parse(variable)를 사용합니다.

좋은 하루 보내십시오.

+2

하지만 where 절은 데이터베이스 외부에서 실행됩니다! –

+2

'AsEnumerable'을 사용하여 중간 목록을 만드는 것을 더 효과적으로하는 것이 더 좋습니다. – juharr

4

를 얻을, 당신은 int.Parse를 호출 할 수 없습니다. Entity Framework는이를 SQL로 변환하는 방법을 모릅니다. Where을 수정하십시오.

+3

how 이 문제를 해결하려면 솔루션을 제공하십시오. 덕분에 – Pouya

6

int.Parse을 모두 SqlFunctions.StringConvert(variable)으로 바꿉니다. String을 Int로 변환하는 함수는 없습니다. 역함수를 수행하고 Int를 StringConvert로 String으로 변환해야합니다.

SqlFunctions 유틸리티는 SQL 명령으로 명령을 변환 할 수 있습니다.

+0

그 반대, 그리고 문자열로 숫자를 변환하지 않을까요? –

+0

int.parse를 SqlFunctions.StringConvert (변수)로 변경했지만 오류가 발생합니다. 질문을 편집합니다. 도와주세요. 감사합니다 – Pouya

+0

tranDate는 어떤 유형입니까? –

6

Entity Framework는 해당 유형의 변환을 SQL로 변환 할 수 없습니다.

실제 데이터 유형 (예 : DateTime 유형)을 사용하도록 데이터 구조를 변경할 수 있습니까? 대용량 데이터의 경우 이와 같은 변환이 성능에 영향을줍니다.

데이터 크기가 항상이 될 경우 을 사용하지 않도록 데이터 모델 유형을 변경 한 다음 데이터를 먼저 가져온 다음 나중에 Linq를 개체로 사용하는 것이 좋습니다.

-1

편집 할 수없는 데이터베이스가 잘못 작성되었지만 사용해야합니다.

나는 이것을 Linq-To-SQL에서 사용하며 작동한다.

문자열을 먼저 객체로 캐스트 한 다음 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 :

대신 int.Pasrse 사용 Convert.ToInt32. Entity Framework는 적절한 CAST 함수를 SQL에 생성합니다.

EF 6 :

짧은 답변 :

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

긴 대답 : 당신이 SqlFunctions.StringConvert에 문자열로 숫자 값을 변환해야 EF 6

. 하지만 문제가 있습니다. 결과에 불필요한 공백이 추가됩니다. 비교가 실패합니다. 그게 내가 Trim()을 넣은 이유입니다. EF 6.1.1에서 테스트했습니다.

+0

누군가이를 확인할 수 있습니까? 나에게 이것은 작동하지 않는다 (EF 6.1.0) – arni

+0

@arni. 내 편집을 참조하십시오. – Mahmoodvcs

+4

질문은 문자열을 int로 파싱하는 것과 관련이 있습니다. – arni