문제

저는 SubSonic을 처음 접했고 LINQ도 처음 접했기 때문에 작은 앱을 함께 만들려고 합니다.

템플릿이 모두 정렬되어 있고 정상적으로 실행되고 있지만 이 LINQ 문에서 약간의 문제가 발생했습니다(약간 단순화했습니다. 실제 문에는 다른 조인이 있지만 이 특정 문제에는 영향을 미치지 않으므로 간결성을 위해 제거했습니다):

var addresses = from address in Database.Addresses.All()
                           select new Address()
                               {
                                   MyNestedType = new NestedType()
                                       {
                                           Field1 = address.ADDR1
                                       }
                               };

이 문을 실행하면 오류가 발생합니다. 'System.String'에서 'NestedType'으로의 캐스팅이 잘못되었습니다. 결과를 열거하려고 할 때.

나는 아마도 명백한 것을 간과하고 있지만 그러한 전환을 요청하는 곳은 어디에서도 볼 수 없습니다.

둘 다 필드1 그리고 주소.ADDR1 문자열입니다.

내가 뭘 잘못하고 있는지 어떤 아이디어가 있습니까?

편집하다:

이에 대해 다시 살펴보았고 더 많은 정보를 제공하기 위한 노력의 일환으로 SimpleRepository와 문제를 보여주는 SQLite 데이터베이스를 사용하여 작고 완전한 예제를 만들었습니다.SimpleRepository를 사용하면 발생하는 오류가 다르지만(시퀀스에 요소가 없음) 결과는 동일합니다.전체 코드는 다음과 같습니다.

 public class DatabaseAddress
 {
     public int Id { get; set; }
     public string Address1 { get; set; }
 }

 public class Address
 {
     public NestedType MyNestedType;
 }

 public class NestedType
 {
     public string Field1 { get; set; }
 }

 static class Program
 {
    [STAThread]
    static void Main()
    {
         var repo = new SimpleRepository("Db", SimpleRepositoryOptions.RunMigrations);
         DatabaseAddress address1 = new DatabaseAddress();
         address1.Address1 = "Test";
         repo.Add(address1);
         var all = repo.All<DatabaseAddress>();
         var addresses = from address in repo.All<DatabaseAddress>()
                         select new Address { MyNestedType = new NestedType { Field1 = address.Address1 } };
    }
 }

이 예에서는 all 데이터베이스에 추가된 객체를 포함하지만 addresses "시퀀스에 요소가 없습니다"가 반환됩니다.

구체적인 유형 대신 익명 유형을 사용하는 경우 select 그것이 작동한다는 진술.

여기에는 분명히 내 지식에 차이가 있습니다.도움을 주시면 감사하겠습니다.

도움이 되었습니까?

해결책

ToList()를 호출해야 합니다. 그렇지 않으면 SubSonic 공급자가 MyNestedType을 사용하여 작업을 시도하지만 데이터베이스에 존재하지 않습니다.

var addresses = from address in repo.All<DatabaseAddress>().ToList()
                        select new Address { MyNestedType = new NestedType { Field1 = address.Address1 } };

업데이트:나중에 ToList를 호출하는 경우에도 작동합니다. 즉:

addresses.ToList().ForEach(address => Console.WriteLine("Address.MyNestedType.Field1 = {0}", address.MyNestedType.Field1));

당신이 언급한 것처럼 SubSonic 쿼리 공급자에는 익명 유형에 대해 작동하기 때문에 버그가 있는 것 같습니다.

다른 팁

제 질문과 답변을 봐주세요 여기.

동일한 문제인지 테스트하는 방법은 다음과 같습니다.

게시한 샘플 코드에서 NestedType의 Field1을 Address1이라는 이름으로 변경하세요.샘플을 다시 실행하세요.작동한다면 동일한 문제와 연결된 질문에서 답변한 수정 사항으로 문제가 해결될 것입니다.

이 시도

var nestedTypes= from address in Database.Addresses.All()
                select new NestedType()
                {
                 Field1 = address.ADDR1
                };
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top