2011-10-06 3 views
2

IDataReader를 클래스에 매핑하는이 함수가 있습니다. 그것은 분명히 C#으로 작성되었습니다. 동료는 코드에서 동일한 메서드를 사용하려고하지만 VB.net에서 작성하고 있습니다. 기본적으로 C#에서 사용되는 람다 식으로 인해이 문제를 다시 작성하는 데 어려움을 겪고 있습니다. 그는 실행하고 있습니다. 닷넷 3.5.C# 람다 함수를 VB.net으로 변환

아무도 도와 줄 수 있습니까? .NET 3.5

private Func<IDataReader, ScanItem> resultMapper = r => 
    { 
     var si = new ScanItem() 
     { 
      StoreGroupCode = r.ToInt32("GRP_CDE"), 
      StoreCode = r.ToInt32("STOR_CDE"), 
      EventNumber = r.ToInt32("EVENT_NUM"), 
      AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), 
      LabelNumber = r.ToInt32("LBL_NUM"), 
      ScanType = r.ToString("INV_SCAN_TYP_IND"), 
      SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), 
      UPC = r.ToLong("VEN_UPC_NUM"), 
      ActualQuantity = r.ToLong("ACT_CNT_QTY") 
     }; 

     return si; 
    }; 
+0

당신이 받아 들일 수있는 답을 표시하도록하십시오. 그리고 가장 좋은 답을 주셨을지라도 귀하의 질문에 대해서도 똑같이해야합니다. – jmoreno

답변

3

IIRC의 VB.NET은 몸 익명 기능을 지원하지 않습니다. VB.NET을 사용하는 동료는이 코드를 포함하는 함수를 정의해야하며 람다 식에서이 함수를 사용해야합니다. 자,이 존재가 말했다,이 경우 몸 복잡한 기능을 사용하기 위해 정말 필요가 없습니다 및이 코드를 단순화 할 수있다 :

private Func<IDataReader, ScanItem> resultMapper = r => new ScanItem 
{ 
    StoreGroupCode = r.ToInt32("GRP_CDE"), 
    StoreCode = r.ToInt32("STOR_CDE"), 
    EventNumber = r.ToInt32("EVENT_NUM"), 
    AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), 
    LabelNumber = r.ToInt32("LBL_NUM"), 
    ScanType = r.ToString("INV_SCAN_TYP_IND"), 
    SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), 
    UPC = r.ToLong("VEN_UPC_NUM"), 
    ActualQuantity = r.ToLong("ACT_CNT_QTY") 
}; 

하는 일반적으로 내 VB.NET이 보일 것이다 너무 녹슨없는 경우 의 라인을 따라 :

Private resultMapper As Func(Of IDataReader, ScanItem) = Function(r) New ScanItem() With { _ 
    .StoreGroupCode = r.ToInt32("GRP_CDE"), _ 
    .StoreCode = r.ToInt32("STOR_CDE"), _ 
    .EventNumber = r.ToInt32("EVENT_NUM"), _ 
    .AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), _ 
    .LabelNumber = r.ToInt32("LBL_NUM"), _ 
    .ScanType = r.ToString("INV_SCAN_TYP_IND"), _ 
    .SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), _ 
    .UPC = r.ToLong("VEN_UPC_NUM"), _ 
    .ActualQuantity = r.ToLong("ACT_CNT_QTY") _ 
} 
+0

포스터에는 실제로 익명의 방법이 필요 없습니다. 그것은 쉽게 단일 라인으로 단순화 될 수 있습니다 .... – Jeff

+0

@ JeffN825, 예. –

0

난 그냥이 시도하고 코드 변환 아무 문제 없었다 :

http://www.developerfusion.com/tools/convert/csharp-to-vb/

유일한 일을 VB.NET 9 (VS 2008/.NET 3.5)는 멀티 라인 람다 식을 지원하지 않습니다. 따라서 두 줄로 나눌 수 없습니다. 그래서

...

Private resultMapper As Func(Of IDataReader, ScanItem) = Function(r) New ScanItem() With { _ 
    .StoreGroupCode = r.ToInt32("GRP_CDE"), _ 
    .StoreCode = r.ToInt32("STOR_CDE"), _ 
    .EventNumber = r.ToInt32("EVENT_NUM"), _ 
    .AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), _ 
    .LabelNumber = r.ToInt32("LBL_NUM"), _ 
    .ScanType = r.ToString("INV_SCAN_TYP_IND"), _ 
    .SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), _ 
    .UPC = r.ToLong("VEN_UPC_NUM"), _ 
    .ActualQuantity = r.ToLong("ACT_CNT_QTY") _ 
} 
+1

자동 변환기가 약간 혼란 스럽습니다. 'Key' 키워드는 익명의 클래스가 아니기 때문에 여기에 속하지 않습니다. –

+0

좋은 지적. 수정 됨. – Jeff

1

쉬운 : 당신은 성가신 명시 적 라인 연속 요청 (_)를 생략 할 수 있습니다 VB의 최신 버전에서

Private resultMapper As Func(Of IDataReader, ScanItem) = Function (r) _ 
    New ScanItem() With { _ 
     .StoreGroupCode = r.ToInt32("GRP_CDE"), _ 
     .StoreCode = r.ToInt32("STOR_CDE"), _ 
     .EventNumber = r.ToInt32("EVENT_NUM"), _ 
     .AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), _ 
     .LabelNumber = r.ToInt32("LBL_NUM"), _ 
     .ScanType = r.ToString("INV_SCAN_TYP_IND"), _ 
     .SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), _ 
     .UPC = r.ToLong("VEN_UPC_NUM"), _ 
     .ActualQuantity = r.ToLong("ACT_CNT_QTY") _ 
    } 

.

+1

'Func '은 아마도'Func (Of IDataReader, ScanItem)'이어야합니다. –

+0

어떻게 컴파일하나요? resultMapper가 선언문에 두 번 있습니다! –

+0

@Chris Typo. 그것을 발견해 주셔서 감사합니다. –