Linq и SubSonic - возвращают вложенные сложные типы - PullRequest
2 голосов
/ 15 июля 2010

Я новичок в SubSonic и довольно новичок в LINQ, поэтому я просто пытаюсь собрать небольшое приложение.

У меня все шаблоны отсортированы и работают нормально, но яу нас возникли небольшие проблемы с этим оператором LINQ (немного упрощенно, у реального оператора есть и другие объединения, но они не влияют на эту конкретную проблему, поэтому я удалил их для краткости):

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

Если я выполню этот оператор, то получу ошибку Неправильное приведение из 'System.String' к 'NestedType'. при попытке перечислить результаты.

Я, вероятно, пропускаю очевидноено я нигде не вижу, чтобы я запрашивал такое преобразование.

Оба Field1 и address.ADDR1 являются строками.

Любые идеи, чтоЯ делаю неправильно?

Редактировать :

Я еще раз посмотрел на это и, пытаясь предоставить больше информации, я создал небольшой,полный пример с использованием SimpleRepository и базы данных SQLite, которая демонстрирует Issуе.Используя 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, это работает.

В моих знаниях явно есть пробел;любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 13 августа 2010

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

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

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

1 голос
/ 13 августа 2010

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

0 голосов
/ 21 июля 2010

Попробуйте это

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