我希望创建一个c#类集合,我需要对其进行索引以加快对某些属性的访问。问题是,该类包含许多对现有服务/类的引用,这些引用不容易序列化/反序列化,因此数据库不够。
class ComplexTestClass
{
public MyService Service;
public Guid Id;
public ComplexObject Object;
}
使用linq,我可以像这样查询一个集合:
complexTestClassCollection.where(complexClass => complexClass.Object.Type == "TestType");
当我的集合增长(它确实变得相当大)时,这些linq查询非常低效。我正在寻找创建某种类型的索引,以便我可以对属性进行查找以避免一起查询linq。
我的搜索引导我LiteDB,它有一种令人印象深刻的索引/查询集合的方式,但要求集合被序列化/反序列化,这是我目前遇到的问题(MyService不是能够序列化而无需大量重写。)
为了澄清,我需要像LiteDB那样更复杂的索引。示例查询可能是:
complexTestClassCollection.where(complexClass => complexClass.Object.Type == "TestType" && complexClass.Object.ParentObject == "TestParent" && complexClass.Object.Members.Contains(4));
在上述情况下,我没有被complexClass.Object.Members.Contains(4)
编入索引,因为complexClass.Object.Type == "TestType" && complexClass.Object.ParentObject == "TestParent"
将结果集变暗为< 10个元素,并且在该集合上运行linq是可以接受的。
答案 0 :(得分:0)
Linq查询遵循延迟执行,因此除非您执行.ToList()或ToCollection(),否则它不会引入所有结果。此外,它取决于您正在执行的搜索类型。我宁愿在linq中使用First()扩展来提前退出。
您还可以将数据放入数据库并使用IQueryable以获得良好的性能。
从长远来看,它是可维护和可扩展的,创建一个将查询转换为sql语句的查询引擎,然后可以通过将其重构为不同的类并查询它们而不是创建大集合来进行水平扩展。和类型和属性的硬编码。