Linq 및 SubSonic - 중첩된 복합 유형 반환
-
16-09-2020 - |
문제
저는 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
};