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 查询提供程序中有一个错误,因为正如您提到的,它确实适用于匿名类型。
其他提示
请看我的问题和回答 这里.
您可以通过以下方法测试是否是同一问题:
在您发布的示例代码中,将 NestedType 中的 Field1 更改为 Address1。重新运行您的示例。如果它有效,同样的问题和我在链接问题中回答的修复应该可以为您解决。
尝试这个
var nestedTypes= from address in Database.Addresses.All()
select new NestedType()
{
Field1 = address.ADDR1
};