IEnumerable Zip 함수는 10 진수 형식에서는 작동하지 않지만 다른 형식에서는 작동합니다.

.net c# dapper sql visual-studio

문제

zip 함수 를 사용하여 두 개의 IEnumerable 객체를 Visual Studio의 C # 응용 프로그램에서 병합합니다. 다음 코드가 있습니다.

static void Main(){

    using (var conn = new SqlConnection(connectionString)){
          conn.Open();

          IEnumerable<string> tmp1 = conn.Query<string>("SELECT NAME FROM Table1");
          IEnumerable<string> tmp2 = conn.Query<string>("SELECT Type FROM Table1");
          IEnumerable<decimal> mock1 = conn.Query<decimal>("SELECT value1 FROM mockData1");
          IEnumerable<decimal> mock2 = conn.Query<decimal>("select value2 FROM mockData2");

          foreach (var item in tmp1.Zip(tmp2, (a, b) => new { a, b })){
             Console.WriteLine(item.a);
             Console.WriteLine(item.b);
             Console.ReadKey();
          }
    }

}

위의 코드를 실행하면 콘솔에서 다음을 출력합니다.

CorrectName1
CorrectType1
CorrectName2
CorrectType2
....

그것은 내가 기대했던 것입니다. 그러나 다음과 같이 변경하면

foreach (var item in mock1.Zip(mock2, (a, b) => new { a, b })){
        Console.WriteLine(item.a);
        Console.WriteLine(item.b);
        Console.ReadKey();
}

프로그램은 콘솔 출력을 완전히 건너 뛰고 오류 목록에는 오류가 없습니다.

본질적으로, 왜 프로그램이 예상대로 10 진수 형식의 IEnumerables가 아닌 string 형식의 IEnumerables에 대해 작동합니까? 여러분이 물어보기 전에 Management Studio를 통해 두 쿼리를 모두 확인했는데 정확합니다. 두 컬렉션을 독립적으로 포함하는 foreach 루프에서 mock1 및 mock2를 반복 할 수는 있지만 어떤 이유로 인해 zip 함수가 IEnumerable <decimal>에 대해 실패합니다.

편집 : 쿼리가 나쁘지 않다는 내 가설을 확인하기 위해 두 foreach 루프는 다음과 같습니다.

foreach (var item in mock1){
    Console.WriteLine(item);
    Console.ReadKey();
}

mock1의 출력 데모 :

Value from mock1 (1)
Value from mock1 (2)
...

/ *** /

foreach (var item in mock2){
    Console.WriteLine(item);
    Console.ReadKey();
}

mock2의 출력 데모 :

Value from mock2 (1)
Value from mock2 (2)
...

수락 된 답변

내 생각 엔 귀하의 데이터베이스가 쿼리에 대한 데이터를 반환하지 않습니다. 쿼리를 배열로 대체 할 때 잘 작동합니다 .

void Main()
{
    IEnumerable<decimal> mock1 = new decimal[] { 1, 2, 3 };
    IEnumerable<decimal> mock2 = new decimal[] { 4, 5, 6 };

    foreach (var item in mock1.Zip(mock2, (a, b) => new { a, b }))
    {
        Console.WriteLine(item.a);
        Console.WriteLine(item.b);
        Console.Read();
    }
}

1

4

2

5

6


인기 답변

그것은 내 잘못이었습니다. mockData1과 mockData2 모두 10 개의 데이터 포인트를 가졌지 만 수동 SQL 삽입 중에 실수로 모든 20을 mockData1에 추가했으며 아무 것도 mockData2에 추가하지 않았습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.