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

在您的第二个代码中,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 回答