Linq и SubSonic — возврат вложенных сложных типов
-
16-09-2020 - |
Вопрос
Я новичок в 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
};