我刚刚开始使用 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();
最佳答案
不同之处在于,在第一种情况下,您在投影之前 调用了 ToList()
。因此,LINQ 提供程序唯一需要担心的是 Where
调用。它将获取每个 Contact
的所有数据,然后在 LINQ to Objects 中进行投影。
在您的第二个代码中,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
,但这实际上是一个空操作。)
关于c# - 具有不同 LINQ 语法的 Raven Db 似乎无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13516141/