2009-08-10 136 views
2

我試圖得到渴望加載與亞音速工作,它一直爲我返回null。Linq嵌套選擇新不工作

在下面的方法中,我試圖水化包含另一個域模型(CompanyModel)的域模型(UserModel)。但是,使用下面的代碼,UserModel.Company始終爲空。

我在這裏錯過了什麼。任何幫助,將不勝感激。

public IList<UserModel> GetUsers() 
{    
    return (from u in SubsonicSqlServer.Users.All() 
      select new UserModel 
         { 
          UserId= u.UserId, 
          Company = (from c in u.Companies 
            select new CompanyModel 
               { 
                CompanyId = c.CompanyId, 
                CompanyName = c.CompanyName 
               }).SingleOrDefault(), 
          FirstName = u.FirstName, 
          LastName = u.LastName, 
          BirthDate = u.BirthDate 
         }).ToList(); 

} 

更新(08/11/09):

更多的代碼周圍玩弄,我發現,在下面的例子中設置CompanyId也不起作用。我最初認爲這是Subsonic的一個問題,但如果下面的代碼不起作用,我猜測它與我的Linq聲明有關。有任何想法嗎?

public IList<UserModel> GetUsers() 
{    
    return (from u in SubsonicSqlServer.Users.All() 
      select new UserModel 
         { 
          UserId= u.UserId,        
          CompanyId = Guid.NewGuid(), 
          FirstName = u.FirstName, 
          LastName = u.LastName, 
          BirthDate = u.BirthDate 
         }).ToList(); 

} 

更新(11/17/2009):

還沒有找到一個解決方案。但我們正在切換到nHibernate(不是因爲這個問題)。

+0

根據這個線程, (選擇非SubSonic類型):http://groups.google.com/group/subsonicproject/browse_thread/thread/2b569539b7f67a34?hl=zh-CN&pli=1它可能與此有關。 – 2009-08-12 04:14:08

+0

你正在使用哪個亞音速版本? – Funky81 2009-08-17 23:44:51

+0

@ Funky812:亞音速版本3.0.0.3 – Jason 2009-08-20 06:24:11

回答

0

兩件事情

  1. 你返回List<UserModel>當你的方法的簽名行說IList<User>確實UserModel繼承User

  2. 我錯過了什麼,e從哪裏來?

FirstName = e.FirstName, LastName = e.LastName, BirthDate = e.BirthDate Blockquote

+0

wawa, 關於 1)我的不好,返回簽名應該是IList 。我將更新原始問題中的代碼 2)再一次,我的壞,e應該是你。我所做的是我複製了實際的源代碼,並將它變成我可以分享的東西。但它似乎沒有足夠小心。 感謝您的支持。 – Jason 2009-08-19 16:07:31

2

「UserModel.Company總是空。」

由於您使用以.SingleOrDefault()結尾的表達式來設置此表達式,因此我將建議查詢不返回單個項目。開始在那裏調查。如果您預計u.Companies中只有一個項目,請更改爲.Single()並強制提前失敗。

你可以在創建新的CompanyModel對象之前做.Single(),我想。

至於風格,我喜歡查詢理解語法(「from x in y select」),但與傳統的點符號語法結合使用時感覺很尷尬。這很難閱讀。 (LINQ - Fluent and Query Expression - Is there any benefit(s) of one over other?)。

考慮在查詢理解中使用let使其更清晰。

此外,由於查詢已經返回IEnumerable<T>,並呼籲ToList()力量去實現所有的項目,我想修改我的方法,如果可能的話,返回IEnumerable<T>

所以,你的情況,我會重構第一個說:

public IEnumerable<User> GetUsers() 
{ 
    return from u in SubsonicSqlServer.Users.All() 
     let c = u.Companies.Single() 
     select new UserModel 
     { 
      UserId = u.UserId, 
      Company = new CompanyModel 
      { 
       CompanyId = c.CompanyId, 
       CompanyName = c.CompanyName 
      }, 
      FirstName = e.FirstName, 
      LastName = e.LastName, 
      BirthDate = e.BirthDate 
     }; 
} 

如果在你的對象模型是有道理的,你可以修改User有一個構造函數無論何種類型u是,和它變得更簡單:

return from u in SubsonicSqlServer.Users.All() 
    select new UserModel (u); 

甚至

return SubsonicSqlServer.Users.All().Select(u => new UserModel (u)); 
+0

周杰倫,我實施了你的建議,現在我得到一個亞音速錯誤:「引用未定義列」。我會繼續排查故障。 – Jason 2009-08-20 06:23:29