Domanda

Sono nuovo a subsonico e abbastanza nuovo nuovo a Linq, quindi sto solo cercando di mettere insieme una piccola app.

Ho dei modelli tutti ordinati e correndo bene, ma ho incontrato un po 'di problemi con questa dichiarazione Linq (semplificata leggermente, la vera affermazione ha alcuni altri unici ma non influenzano questo particolare problema Li ho rimossi per Brevity):

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

Se eseguo questa dichiarazione, ottengo l'errore cast non valido da 'system.string' a 'nidydype'. quando provo a enumerare i risultati.

Probabilmente mi trascuro l'ovvio ma non riesco a vedere da nessuna parte che chiedo una tale conversione.

entrambi field1 e indirizzo.addr1 sono stringhe.

Qualche idea Cosa sto facendo male?

Modifica :

Ho avuto un altro sguardo a questo e nel tentativo di fornire ulteriori informazioni, ho creato un piccolo esempio completo utilizzando SimpleRepository e un database SQLite che dimostra il problema. Usando SIMPERPOSITORY L'errore che ottengo è diverso (la sequenza non contiene elementi) ma il risultato è lo stesso. Ecco il codice 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 } };
    }
 }
.

In questo esempio, all contiene l'oggetto aggiunto al database, ma addresses returns "Sequenza non contiene elementi".

Se utilizzo tipi anonimi invece di tipi di calcestruzzo nell'istruzione select funziona.

C'è ovviamente un gap nella mia conoscenza qui; Qualsiasi aiuto apprezzato.

È stato utile?

Soluzione

Devi chiamare il tolasist (), altrimenti il fornitore subsonico cerca di fare qualcosa con MyNestetType e non esiste nel database.

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

Aggiornamento: funziona anche se chiami il tolasist in seguito, I.e.:

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

Immagino che ci sia un bug nel fornitore di query subsonico, perché funziona per i tipi anonimi, come hai detto.

Altri suggerimenti

Si prega di consultare la mia domanda e risposta qui . .

Ecco come puoi testare se è lo stesso problema:

In quel codice di esempio pubblicato, cambia campo1 nella tua nidante per essere denominata indirizzo1.Rieseguire il tuo campione.Se funziona, lo stesso problema e la soluzione con cui ho risposto con la domanda collegata dovrebbe risolverlo per te.

Prova questo

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top