2014-02-26 2 views
1

Linq를 사용하여 객체 중 하나를 선택하고 싶은데 요소 중 하나가 숫자이고 즉석에서 문자열로 서식을 지정하려고합니다. 다른 열의 일부 데이터를 포함하여 특정 설명 텍스트를 만들려고합니다. 선택 문장을 보면 2 자리 소수점을 사용하여 문자열을 Currency로 포맷하려고합니다. 작동하지 않습니다. 이 작업을 어떻게 올바르게 수행해야합니까?Linq를 사용하여 형식화 된 문자열로 객체 선택

var stuff = from obj in _dbc.Stuff 
where 
    SqlMethods.Like(obj.SEGMENT2, "0023") && 
    SqlMethods.Like(obj.SEGMENT4, "1243") 
group obj by new 
    { 
     obj.SEGMENT1 
    } 
into g 
select new StuffObject 
{ 
    Item = g.Key.SEGMENT1, 
    Description = 
     string.Format("{0:C2}", g.Sum(p => p.VALUE == null ? 0 : p.VALUE.Value)) //<-- This is not working for me 
     + "<br/>" + g.Min(p => p.DESCRIPTION), 
    DeCode = g.Min(p => p.SEGMENT2), 
    CeCode = g.Min(p => p.SEGMENT4), 
    QTY = g.Sum(p => p.QUANTITY == null ? 0 : (int)p.QUANTITY), 
    Cost = g.Sum(p => p.VALUE == null ? 0 : (double)p.VALUE) 
}; 

, BTW 오류 코드 미안의 receiveing은 다음과 같습니다 System.InvalidOperationException: Could not translate expression .... abbreviated ...into SQL and could not treat it as a local expression.

는 (I 시도 haven't 아직 대답 @Grundy) 지금처럼 내 StuffObject 클래스 :

public class StuffObject 
{ 
    public string Item { get; set; } 
    public string Description { get; set; } 
    public string DeCode { get; set;} 
    public string CeCode { get; set; } 
    public int QTY{ get; set; } 
    public double Cost { get; set; } 
} 
+1

같은 LINQ 쿼리를 변경할 수 있습니다 혼자가 뭘 잘못했는지에 대한 단서를 제공하지 않습니다 "작동하지 않는" **. 즉, DB에 'NULL'값이 있다고 가정합니다. 이 경우'null'과 비교할 필요없이'DBNull.Value'와 비교할 수 있습니다 :'g.sum (p => p.VALUE! = DBNull.Value? 0 : p.VALUE.Value))' –

+0

샘플에서 불필요한 코드를 모두 제거 할 수 있습니까? 불필요한 코드를 제거하면 더 쉽게 집중할 수 있으며 대답을 밝힐 수도 있습니다. – wizulus

+0

DBNull 문제는 아닙니다. 그렇지 않으면 p.VALUE.Value가 실패합니다. p.VALUE는 분명히 nullable 프리미티브입니다. – wizulus

답변

1

LINQ는 string.Format을 SQL로 변환 할 수 없으므로 제거해야합니다. 당신은

public class StuffObject{ 
    .... 
    private decimal sumValue; 
    private decimal description; 
    public string Description { 
     get{ 
      return string.Format("{0:C2}<br/>{1:C2}", sumvalue,description); 
     } 
    } 
    .... 
} 

같은 StuffObject을 변경 한 다음 ** 정확히 무슨 일 지정하십시오이

.... 
select new StuffObject 
{ 
    Item = g.Key.SEGMENT1, 
    description =g.Min(p => p.DESCRIPTION), 
    sumValue =g.Sum(p => p.VALUE == null ? 0 : p.VALUE.Value), 
    DeCode = g.Min(p => p.SEGMENT2), 
    CeCode = g.Min(p => p.SEGMENT4), 
    QTY = g.Sum(p => p.QUANTITY == null ? 0 : (int)p.QUANTITY), 
    Cost = g.Sum(p => p.VALUE == null ? 0 : (double)p.VALUE) 
}; 
+0

감사합니다. 그랜디, 시도해 보겠습니다. 조금만 알려 드리겠습니다. – gardarvalur

+1

@ gardarvalur 아마도 'long','int'와 같은'sumValue' 필드에 또 다른 타입을 사용해야합니다. – Grundy

+0

@gardarvalur'description' 필드와 혼동 스럽습니다. 문자열이나 숫자입니까? – Grundy

관련 문제