我正在尝试编写一个索引来查看我们的日志,以查找由于经历了部分流程而不可用的实体,但不是流程的第二部分,然后使它们可用。我们的进口流程首先发生,然后是清洁流程。然后认为已经通过我们的清洁过程的实体可用。我想基本上找出那些在最后一次清理发生后经历了导入过程(因此重置它们)的实体。
我想出了这张潜在的地图:
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))
但没有快乐,我仍然得到同样的错误信息。
如何让此代码生效?或者我需要采取完全不同的方法吗?
任何帮助表示感谢。
答案 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
是现有的文档集合,则需要加载每个日志并将其保存回数据库。