Linq和SubSonic - 返回嵌套的复杂类型

时间:2010-07-15 11:43:33

标签: linq linq-to-sql subsonic subsonic3

我是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数据库创建了一个小而完整的示例。使用SimpleRepository我得到的错误是不同的(Sequence不包含任何元素),但结果是相同的。这是完整的代码:

 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返回“Sequence contains no elements”。

如果我在select语句中使用匿名类型而不是具体类型,则可以使用。

我的知识显然存在差距;任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

请参阅我的问题和回答here

以下是测试是否存在相同问题的方法:

在您发布的示例代码中,将NestedType中的Field1更改为名为Address1。重新运行您的样本。如果它有效,同样的问题和我在链接问题中回答的修复应该为你解决。

答案 1 :(得分:1)

您必须调用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查询提供程序中存在一个错误,因为它确实适用于匿名类型,如您所述。

答案 2 :(得分:0)

试试这个

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