Question

Je suis nouveau sur SubSonic et raisonnablement nouveau sur LINQ également, j'essaie donc simplement de créer une petite application.

J'ai tous les modèles triés et fonctionnant correctement, mais j'ai rencontré quelques problèmes avec cette instruction LINQ (légèrement simplifiée, la vraie instruction a d'autres jointures mais elles n'affectent pas ce problème particulier, donc j'ai je les ai supprimés par souci de concision) :

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

Si j'exécute cette instruction, j'obtiens l'erreur Conversion non valide de « System.String » vers « NestedType ». quand j'essaie d'énumérer les résultats.

J'oublie probablement l'évidence, mais je ne vois nulle part que je demande une telle conversion.

Les deux Champ1 et adresse.ADDR1 sont des chaînes.

Avez-vous une idée de ce que je fais de mal ?

Modifier:

J'ai réexaminé cela et dans le but de fournir plus d'informations, j'ai créé un petit exemple complet utilisant SimpleRepository et une base de données SQLite qui illustre le problème.En utilisant SimpleRepository, l'erreur que j'obtiens est différente (la séquence ne contient aucun élément) mais le résultat est le même.Voici le code complet :

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

Dans cet exemple, all contient l'objet ajouté à la base de données, mais addresses renvoie "La séquence ne contient aucun élément".

Si j'utilise des types anonymes au lieu de types concrets dans le select déclaration, cela fonctionne.

Il y a évidemment une lacune dans mes connaissances ici ;toute aide appréciée.

Était-ce utile?

La solution

Vous devez appeler ToList(), sinon le fournisseur SubSonic essaie de faire quelque chose avec MyNestedType et il n'existe pas dans la base de données.

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

Mise à jour:Cela fonctionne également si vous appelez ToList par la suite, c'est-à-dire :

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

Je suppose qu'il y a un bug dans le fournisseur de requêtes SubSonic, car il fonctionne pour les types anonymes, comme vous l'avez mentionné.

Autres conseils

S'il vous plaît voir ma question et ma réponse ici.

Voici comment tester s'il s'agit du même problème :

Dans cet exemple de code que vous avez publié, modifiez Field1 dans votre NestedType pour qu'il soit nommé Address1.Réexécutez votre échantillon.Si cela fonctionne, le même problème et le correctif auquel j'ai répondu dans la question liée devraient le résoudre pour vous.

Essaye ça

var nestedTypes= from address in Database.Addresses.All()
                select new NestedType()
                {
                 Field1 = address.ADDR1
                };
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top