C# 具有不同LINQ语法的Raven Db似乎无法工作

C# 具有不同LINQ语法的Raven Db似乎无法工作,c#,ravendb,C#,Ravendb,我刚刚开始使用RavenDB,遇到了一个奇怪的场景 当我运行下面的查询时,模型填充得很好。一切都很好 var contacts = Session.Query<Contact>() .Where(c => c.UserId == this.userId) .ToList(); var model = contacts.Select(c => new SelectListItem()

我刚刚开始使用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();
然而,这不是我开始使用的代码。我从下面的代码开始,它从联系人全名填充文本属性。出于某些随机原因,它不会从联系人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();
我不确定这是一个bug还是我只是缺少了一些简单的东西。想法

**更新**

它也不喜欢这种语法。我一定错过了一些基本的东西

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

不同的是,在第一种情况下,在投影之前有一个ToList调用。所以LINQ提供者需要担心的唯一一件事就是Where调用。它将获取每个联系人的所有数据,然后在LINQ中投影到对象

在第二段代码中,Select调用也需要由LINQ提供程序来处理——可能它没有做正确的事情

是的,这听起来像是RavenDB LINQ提供程序中的一个bug,在Select处理中

请注意,强制在LINQ to对象中执行其余查询的另一种方法是使用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,但这确实是一个禁忌。

谢谢您的回答。我不喜欢我们从文档中提取所有数据,但我想它必须工作。假设联系人文档中包含大量数据,您不希望Linq提供程序处理select而不是获取所有数据吗?@BrettAllred:是的,绝对如此-我建议您在您的场景中针对Raven提出一个bug。我能够在RavenDB 1.0.960中重现.Id属性为null的情况,但不是在当前1.2不稳定的版本中。因此,我认为这是一个已经修复的bug。根据Ayende的说法,1.2已经非常接近RTM,所以如果可以的话,我现在就切换。