Pergunta

Eu sou novo para Subsônicas e razoavelmente novo para LINQ bem, então eu só estou tentando colocar um pouco de aplicativo.

Eu tenho os modelos de todos os classificados e executando tudo bem, mas eu tenho um pouco de dificuldade com esta instrução LINQ (simplificado um pouco, a verdadeira declaração tem algumas outras associações, mas eles não afetam esse problema específico para que eu tenha removido para fins de brevidade):

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

Se eu executar esta instrução recebo a mensagem de erro Inválido elenco de 'Sistema.Seqüência de caracteres de' a 'NestedType'. quando eu tento enumerar os resultados.

Eu sou provavelmente com vista para o óbvio, mas eu não posso ver em qualquer lugar que eu solicitação de tal conversão.

Ambos Campo1 e o endereço.ADDR1 são cadeias de caracteres.

Alguma idéia do que eu estou fazendo de errado?

Editar:

Eu já tinha um outro olhar para esta e, em um esforço para fornecer mais informações, criei um pequeno exemplo completo usando SimpleRepository e um banco de dados SQLite que demonstra o problema.Usando SimpleRepository o erro que eu vejo é diferente (Seqüência não contém elementos), mas o resultado é o mesmo.Aqui está o código completo:

 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 } };
    }
 }

Neste exemplo, all contém o objeto adicionado ao banco de dados, mas addresses retorna "Seqüência não contém elementos".

Se eu usar os tipos anônimos, em vez de concreto, tipos na select instrução funciona.

Claro que existe uma lacuna em meu conhecimento aqui;qualquer ajuda apreciado.

Foi útil?

Solução

Você tem que chamar ToList(), caso contrário, o SubSonic o fornecedor tenta fazer algo com MyNestedType e ele não existir no banco de dados.

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

Atualização:Ele também funciona se você chamar ToList depois, i.e.:

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

Eu acho que há um erro no Subsónico consulta provedor, porque ela não funciona para os tipos anônimos, como você mencionou.

Outras dicas

Por favor, veja a minha pergunta e resposta aqui.

Aqui está como você pode testar se é o mesmo problema:

Que exemplo de código que você postou, alterar Campo1 no seu NestedType para ser chamado Endereço1.Re-execute o exemplo.Se ele funciona, o mesmo problema e a correção respondi com a ligado pergunta deve resolvê-lo para você.

Tente isso

var nestedTypes= from address in Database.Addresses.All()
                select new NestedType()
                {
                 Field1 = address.ADDR1
                };
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top