Ravendb Raven索引创建在使用FindLastIndex时出现编译错误CS1977

Ravendb Raven索引创建在使用FindLastIndex时出现编译错误CS1977,ravendb,Ravendb,我试图编写一个索引,查看我们的日志,以查找由于经历了流程的一部分而不经历流程的第二部分而不可用的实体,从而使它们可用。首先是我们的进口流程,然后是我们的清洁流程。通过我们的清洁流程的实体将被视为可用。我想从本质上找出在上次清理之后已经经历导入过程(因此重置它们)的实体 我想出了这个潜在的地图: AddMap<EntityLog>(docs => docs.Where(doc => doc.Details != null) .Where(doc =>

我试图编写一个索引,查看我们的日志,以查找由于经历了流程的一部分而不经历流程的第二部分而不可用的实体,从而使它们可用。首先是我们的进口流程,然后是我们的清洁流程。通过我们的清洁流程的实体将被视为可用。我想从本质上找出在上次清理之后已经经历导入过程(因此重置它们)的实体

我想出了这个潜在的地图:

AddMap<EntityLog>(docs => docs.Where(doc => doc.Details != null)
        .Where(doc => doc.Details.Any(d => d.QueueMessage != null && d.QueueMessage.JobsToDo.Contains(JobType.Import)
            && d.Finished != null))
        .Where(doc => doc.Details.Any(d => d.QueueMessage != null && d.QueueMessage.JobsToDo.Contains(JobType.Clean)
            && d.Finished != null))
        .Where(doc => doc.Details.FindLastIndex(d => d.QueueMessage.JobsToDo.Contains(JobType.Clean) && d.Finished != null) <
            doc.Details.FindLastIndex(d => d.QueueMessage.JobsToDo.Contains(JobType.Import) && d.Finished != null))
        .Select(found => new
        {
            found.EntityID,
            User = found.Details.Select(d => d.User)
       }));
AddMap(docs=>docs.Where(doc=>doc.Details!=null)
.Where(doc=>doc.Details.Any(d=>d.QueueMessage!=null&&d.QueueMessage.JobsToDo.Contains(JobType.Import)
&&d.完成!=空)
.Where(doc=>doc.Details.Any(d=>d.QueueMessage!=null&&d.QueueMessage.JobsToDo.Contains(JobType.Clean)
&&d.完成!=空)
.Where(doc=>doc.Details.findlastinex(d=>d.QueueMessage.JobsToDo.Contains(JobType.Clean)和&d.Finished!=null)<
doc.Details.FindLastIndex(d=>d.QueueMessage.JobsToDo.Contains(JobType.Import)和&d.Finished!=null))
.选择(找到=>新建
{
找到了.EntityID,
User=found.Details.Select(d=>d.User)
}));
它在VS中编译,但当我尝试创建此索引时,出现以下错误:

CS1977“如果不首先将lambda表达式强制转换为委托或表达式树类型,则无法将其用作动态调度操作的参数”

从一些选择性评论来看,这似乎是我使用FindLastIndex的地方。通过研究,我知道当你试图处理非类型化的对象时,会出现这个编译器错误,而你不应该这样做。从Raven生成的代码的输出来看,它使用了很多动态功能,所以我猜它与此相关。我试过用这句话来代替那句话:

.Where(doc => Array.FindLastIndex(doc.Details.ToArray(), d => d.QueueMessage.JobsToDo.Contains(JobType.Clean) && d.Finished != null) <
            Array.FindLastIndex(doc.Details.ToArray(), d => d.QueueMessage.JobsToDo.Contains(JobType.Import) && d.Finished != null))
.Where(doc=>Array.findlastedex(doc.Details.ToArray(),d=>d.QueueMessage.JobsToDo.Contains(JobType.Clean)和&d.Finished!=null)<
Array.FindLastIndex(doc.Details.ToArray(),d=>d.QueueMessage.JobsToDo.Contains(JobType.Import)和&d.Finished!=null))
但是没有乐趣,我仍然收到相同的错误消息

如何使此代码正常工作?还是我需要采取完全不同的方法


非常感谢您的帮助。

FindLastIndex是列表中的一个方法,但我们不知道服务器端的类型,因此不可用。
使用IEnumerable上的扩展方法。

只需在使用
FindLastIndex
EntityLog
上创建一个get only属性,即可将该信息的结果序列化到数据库并易于搜索

这是我在处理列表时遵循的一种相当常见的模式

public class Foo {
    public List<Phones> Phones { get;set; }

    public Phone PrimaryPhone { 
            get { return Phones.SingleOrDefault(x=> x.Primary == true)) }
    }    
}
公共类Foo{
公共列表电话{get;set;}
公用电话主要电话{
获取{return Phones.SingleOrDefault(x=>x.Primary==true))}
}    
}

注意,如果
EntityLog
是一个已经存在的文档集合,则需要加载每个日志并将其保存回数据库。

谢谢您的回复。我试着将它转换为((IEnumerable)doc.Details),但在这里我没有得到任何有用的东西。我遗漏了什么吗?因为无论何时我们更新日志,我们都会加载日志并将其存储回去,而不是进行修补或其他任何操作,这对我们来说是可行的。谢谢