3

私は RavenDB を使い始めたばかりで、奇妙なシナリオに遭遇しました。

次のクエリを実行すると、モデルに問題なくデータが取り込まれます。すべてがうまく機能します。

var contacts = Session.Query<Contact>()
                      .Where(c => c.UserId == this.userId)
                      .ToList();

var model = contacts.Select(c => new SelectListItem() { 
                                     Text = c.FullName, 
                                     Value = c.Id }).ToList();

ただし、それは私が始めたコードではありません。連絡先の FullName から Text プロパティを設定する以下のコードから始めました。なんらかのランダムな理由で、連絡先 ID から Value プロパティを設定しません。

 var model = (from c in Session.Query<Contact>()
              where c.UserId == this.userId
              select new SelectListItem() { 
                         Text = c.FullName, 
                         Value = c.Id }).ToList();

これがバグなのか、単純なものが欠けているだけなのかはわかりません。アイデア?

** アップデート **

この構文も好きではありません。ここで本当に基本的な何かが欠けているに違いありません。

 var model = Session.Query<Contact>()
                    .Where(c => c.UserId == this.userId)
                    .Select(c => new SelectListItem() { Text = c.FullName, Value = c.Id })
                    .ToList();
4

1 に答える 1

2

違いは、最初のケースでは、プロジェクションのToList()に呼び出しがあることです。したがって、LINQ プロバイダーが気にする必要があるのは呼び出しだけです。各 のすべてのデータがフェッチされ、代わりに LINQ to Objects で射影が行われます。WhereContact

2 番目のコードでは、Select呼び出しは LINQ プロバイダーによっても処理される必要があります。おそらく、正しいことをしていません。

そうです、これは RavenDB LINQ プロバイダーのSelect処理におけるバグのように思えます。

残りのクエリを LINQ to Objects で実行するように強制する別の方法は、使用することであることに注意してくださいAsEnumerable()。これは機能するはずです。

var model = Session.Query<Contact>()
                   .Where(c => c.UserId == this.userId)
                   .AsEnumerable()
                   .Select(c => new SelectListItem { 
                                  Text = c.FullName, 
                                  Value = c.Id })
                   .ToList();

(オブジェクト初期化式でも変換new SelectListItem()new SelectListItemましたが、それは実際にはノーオペレーションです。)

于 2012-11-22T15:54:42.410 に答える