【发布时间】:2010-07-15 11:43:33
【问题描述】:
我是 SubSonic 的新手,对 LINQ 也相当陌生,所以我只是想把一个小应用程序放在一起。
我已经将模板全部排序并且运行良好,但是我在使用这个 LINQ 语句时遇到了一些麻烦(稍微简化一下,真正的语句还有一些其他的连接,但它们不会影响这个特定的问题,所以为简洁起见,我已将其删除):
var addresses = from address in Database.Addresses.All()
select new Address()
{
MyNestedType = new NestedType()
{
Field1 = address.ADDR1
}
};
如果我执行此语句,当我尝试枚举结果时,我会收到错误Invalid cast from 'System.String' to 'NestedType'。
我可能忽略了显而易见的事情,但我看不到我要求进行此类转换的任何地方。
Field1 和 address.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 语句中使用匿名类型而不是具体类型,它会起作用。
我的知识显然存在差距;任何帮助表示赞赏。
【问题讨论】:
-
您的代码肯定有其他问题,根据提供的信息无法确定问题所在。基于这个 sn-p,唯一的可能是 Field1 是 NestedType 类型。既然你说它是一个字符串,那么你没有给我们足够的实际代码来解决这个问题。
-
感谢您的评论。我认为我已经添加了足够的信息,因为实际上没有比我发布的更多的代码。我已经编辑了我的原始帖子并添加了一个完整的示例。
标签: linq linq-to-sql subsonic subsonic3