2010-07-15 69 views
2

我是SubSonic的新手,也是LINQ的新手,所以我只是想把一個小應用程序放在一起。Linq和SubSonic - 返回嵌套的複雜類型

我已經將模板全部排序並運行正常,但是我對這個LINQ語句遇到了一些麻煩(簡化了一下,真正的語句有一些其他的連接,但是它們不影響這個特定的問題所以我已經刪除它們爲了簡潔):

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

如果我執行該語句我從「System.String」到「NestedType」得到錯誤無效轉換。當我嘗試枚舉結果時出現

我可能忽略了顯而易見的事實,但我無法看到任何需要這種轉換的地方。

Both Field1 and 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返回「序列不包含任何元素」。

如果我在select語句中使用匿名類型而不是具體類型,它將起作用。

我的知識顯然存在差距;任何幫助讚賞。

+0

您的代碼必須有其他錯誤,根據所提供的信息不可能確定哪些錯誤。根據這段代碼,唯一的可能性是Field1是NestedType類型。既然你說這是一個字符串,那麼你沒有給我們足夠的實際代碼來解決這個問題。 – 2010-08-12 19:25:29

+0

感謝您的評論。我想我已經添加了足夠的信息,因爲實際上沒有比我發佈的代碼多得多的代碼。我編輯了我原來的帖子並添加了一個完整的示例。 – nukefusion 2010-08-12 21:56:57

回答

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)); 

我想有一個亞音速查詢提供一個漏洞,因爲它的工作匿名類型,正如你所提到。

+0

這對我來說。我現在可以看到我錯在哪裏。謝謝。 – nukefusion 2010-08-12 22:55:29

+0

這不會破壞where子句和排序等到SQL的翻譯,因爲在應用任何其他可轉換子句之前,通過調用ToList來提取和枚舉整個表? – 2010-08-13 05:48:19

+0

好點。我不知道答案,但大概是這樣...... – nukefusion 2010-08-13 09:08:54

0

試試這個

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

這並沒有達到我所追求的目標,這是一種嵌套在另一種內的類型。 – nukefusion 2010-07-22 07:30:25

2

請參閱我的問題和回答here

這裏是你如何測試是否是同一個問題:

在你張貼的示例代碼,更改字段1在NestedType被命名地址1。重新運行您的示例。如果它有效,同樣的問題以及我在鏈接問題中回答的問題應該可以爲您解決。

+0

這似乎並沒有解決它在這種情況下,但無論如何,我會研究一個有趣的領導,謝謝。 – nukefusion 2010-08-12 22:27:55

+0

這幾乎是正確的 - MyNestedType也必須重命名以匹配類名,反之亦然。實際上,我只是試着用Field1保持不變,並且它可以工作,所以只需要更改MyNestedType以匹配類名(或將類重命名爲MyNestedType)。 – 2010-08-12 23:05:39

+0

啊,廢話,沒關係,它沒有工作,現在我得到原來的錯誤:從'System.String'無效轉換爲'SubSonicTest.NestedType'。我忘了將它從匿名類型改回。 D'哦。 – 2010-08-12 23:09:58