2009-08-10 10 views
2

私はSubsonicで作業することを熱望しています。Linqのネストされたセレクトの新しい機能が動作しない

以下の方法では、別のドメインモデル(CompanyModel)を含むドメインモデル(UserModel)を水和しようとしています。ただし、以下のコードでは、UserModel.Companyは常にnullです。

私はここで何が欠けていますか?どんな助けもありがとう。

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

} 

アップデート(2009年11月17日):

はまだ解決策を見つけていません。しかし、私たちはnHibernate(この問題のためではありません)に切り替えています。

+0

このスレッドによれば、 (非サブソニックタイプにする):http://groups.google.com/group/subsonicproject/browse_thread/thread/2b569539b7f67a34?hl=en&pli=1それはそれに関連するかもしれません。 –

+0

使用している亜音速バージョンですか? – Funky81

+0

@ Funky812:Subsonicバージョン3.0.0.3 – Jason

答えて

0

2つのこと

  1. あなたは戻っているList<UserModel>あなたのメソッドのシグネチャラインはIList<User>UserからUserModel継承を行うと言うとき?

  2. 私に何かが紛れていますか?eはどこから来たのですか?

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

+0

wawa、 について について1)私の悪いことに、返品の署名はIList だったはずです。私は元の質問のコードを更新します 2)もう一度、私の悪い、e、uされている必要があります。私がしたのは、実際のソースコードをコピーして、共有できるものに変えたということでした。しかし、それは十分に注意深く行われていなかったようです。 ありがとうございます。 – Jason

2

"UserModel.Companyは常にnullです。"

これは末尾が.SingleOrDefault()の式で設定するため、クエリでは単一のアイテムが返されないことを示します。調査を開始します。 u.Companiesに正確に1つのアイテムが必要な場合は、.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 
     }; 
} 

それはあなたのオブジェクトモデルで理にかなっている場合、あなたはuが何であれタイプ取るコンストラクタを持つようにUserを変更する可能性があり、それがさらに簡単取得します。

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

あるいは

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

Jay、あなたの提案を実装しましたが、今はSubsonicエラーが発生しています: "未定義列への参照"。私はトラブルシューティングを続けます。 – Jason

関連する問題