具有不同LINQ语法的Raven Db似乎不起作用

时间:2012-11-22 15:46:59

标签: c# ravendb

我刚开始使用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();

1 个答案:

答案 0 :(得分:2)

不同之处在于,在第一种情况下,您在投影之前有一个ToList()来电。因此,LINQ提供商唯一需要担心的是Where调用。它将为每个Contact获取所有数据,然后在LINQ to Objects中进行投影。

在你的第二个代码中,Select调用也需要由LINQ提供者处理 - 并且可能是它没有做正确的事情。

所以是的,这听起来像是Select处理中RavenDB LINQ提供程序中的一个错误。

请注意,另一种强制查询的其余部分在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,但这实际上是无操作。)