Вопрос

Я новичок в 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 есть ошибка, потому что, как вы упомянули, он работает для анонимных типов.

Другие советы

Пожалуйста, посмотрите мой вопрос и ответ здесь.

Вот как вы можете проверить, является ли это той же проблемой:

В опубликованном вами примере кода измените Field1 в вашем NestedType на имя Address1.Повторно запустите образец.Если это работает, та же проблема и исправление, на которое я ответил в связанном вопросе, должны решить ее за вас.

Попробуй это

var nestedTypes= from address in Database.Addresses.All()
                select new NestedType()
                {
                 Field1 = address.ADDR1
                };
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top