我是 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
                };
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top