我刚开始使用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();
答案 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
,但这实际上是无操作。)