C# 具有不同LINQ语法的Raven Db似乎无法工作
我刚刚开始使用RavenDB,遇到了一个奇怪的场景 当我运行下面的查询时,模型填充得很好。一切都很好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()
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,所以如果可以的话,我现在就切换。