Pregunta

Soy nuevo en el Subsónicos y razonablemente nuevo a LINQ, así que sólo estoy tratando de poner un poco de app juntos.

Tengo las plantillas de todos ordenados y funcionando bien, pero me he encontrado con un poco de problemas con este LINQ declaración (simplificado un poco, la declaración real tiene algunas otras combinaciones pero que no afectan a este problema en particular por lo que me he quitado por razones de brevedad):

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

Si puedo ejecutar esta instrucción me sale el error No válido del elenco de 'Sistema.Cadena' a 'NestedType'. cuando trato de enumerar los resultados.

Probablemente estoy con vistas a la obvia pero no puedo ver en cualquier lugar que puedo solicitar una conversión de este tipo.

Ambos Campo1 y dirección.ADDR1 son cadenas.

Alguna idea de lo que estoy haciendo mal?

Editar:

He tenido otro vistazo a esto y en un esfuerzo para proporcionar más información, he creado un pequeño ejemplo completo del uso de SimpleRepository y una base de datos SQLite que muestra el problema.El uso de SimpleRepository el error que me sale es diferente (Secuencia no contiene elementos), pero el resultado es el mismo.Aquí está el 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 } };
    }
 }

En este ejemplo, all contiene el objeto añadido a la base de datos, pero addresses devuelve "de la Secuencia no contiene elementos".

Si yo uso los tipos anónimos en lugar de tipos concretos en el select instrucción funciona.

Obviamente hay un vacío en mi conocimiento aquí;cualquier ayuda es apreciada.

¿Fue útil?

Solución

Usted tiene que llamar a ToList(), de lo contrario el Subsónico proveedor intenta hacer algo con MyNestedType y no existe en la base de datos.

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

Actualización:También funciona si la llamada ToList después, es decir:

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

Supongo que hay un error en el Subsónico proveedor de consultas, ya que no funciona para los tipos anónimos, como usted ha mencionado.

Otros consejos

Por favor, ver a mi pregunta y la respuesta aquí.

He aquí cómo usted puede probar si es el mismo problema:

En el que muestra el código que has publicado, cambio Campo1 en su NestedType a ser nombrado Dirección1.Vuelva a ejecutar el ejemplo.Si funciona, mismo problema y la solución que me respondió en el vinculado pregunta que debe resolver para usted.

Intente esto

var nestedTypes= from address in Database.Addresses.All()
                select new NestedType()
                {
                 Field1 = address.ADDR1
                };
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top