使用FindLastIndex时,Raven Index创建会出现编译错误CS1977

时间:2014-08-01 09:52:51

标签: ravendb

我正在尝试编写一个索引来查看我们的日志,以查找由于经历了部分流程而不可用的实体,但不是流程的第二部分,然后使它们可用。我们的进口流程首先发生,然后是清洁流程。然后认为已经通过我们的清洁过程的实体可用。我想基本上找出那些在最后一次清理发生后经历了导入过程(因此重置它们)的实体。

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

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)
       }));

它在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))

但没有快乐,我仍然得到同样的错误信息。

如何让此代码生效?或者我需要采取完全不同的方法吗?

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

FindLastIndex是List上的一个方法,但是我们不知道服务器端的类型是什么,因此不可用。 请改用IEnumerable上的扩展方法。

答案 1 :(得分:0)

只需在EntityLog上创建一个使用FindLastIndex的获取属性,然后该信息的结果就会被序列化到数据库并且易于搜索。

这是我在使用列表时遵循的一种相当常见的模式。

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

    public Phone PrimaryPhone { 
            get { return Phones.SingleOrDefault(x=> x.Primary == true)) }
    }    
}

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