2012-09-25 3 views
3

개체 컬렉션을 허용하고 빠른 쿼리를 위해 최적화 된 인덱싱 된 데이터 구조를 반환하는 라이브러리를 찾고 있습니다.개체의 빠른 쿼리 가능한 컬렉션

이 아마 더 나은 예에 의해 설명된다

public class MyClass 
{ 
    public sting Name {get;set;} 
    public double Number {get;set;} 
    public ... (Many more fields) 
}  


var dataStore = Indexer.Parse(myClassCollection).Index(x => x.Name).Index(x => x.Number).Index(x => x.SomeOtherProperty); 
var queryResult = dataStore.Where(x => x.Name == "ABC").Where(x => x.Number == 23).Where(x => x.SomeOtherProperty == dateTimeValue); 

아이디어가 dataStore에 쿼리가 O(log n)의 순서로, 매우 빠르게 될 것입니다.

색인을 생성하려는 필드가 2 개 또는 3 개 이상인 경우 사전 사전을 사용하기 시작합니다.

이미 이와 같은 작업을 수행하는 라이브러리가 있습니까?

+0

데이터베이스는 어떻습니까? SQLite 또는 SQL Server Express가 마음에 듭니다 –

+0

아래에 언급했듯이 모든 것을 메모리에 보관하고 싶습니다. 나는 SQLite가 메모리 모듈을 가지고 있다는 것을 알고 있지만, 내가하려고하는 것에 대해 단지 중량감을 느낀다. – ckoo

+0

Microsoft의 .NET에없는 것은 아닙니다. .NET은 데이터베이스가 되려고하지 않으며 (그러고 싶지도 않습니다.) 콜렉션의 경우 키가 해시되고 그에 관한 것입니다. DataTable은 여러 개의 키를 가질 수 있지만 DataTable은 .NET 4.0 이상의 컬렉션과 비교할 때 속도가 느립니다. 얼마나? List에 LINQ는 꽤 빠릅니다. – Paparazzi

답변

2

object oriented database은?

Sterling은 권장되는 옵션입니다. 그것은 LINQ to Object를 지원하므로 쿼리에 대해 걱정하지 않아도되고 좋은 결과를 보이는 몇 가지 중간 프로젝트에 사용했습니다 (꽤 빠름).

+0

링크를 제공해 주셔서 감사합니다.나는 메모리에있는 모든 정보를 유지하는 아주 가벼운 것을 찾고있다. (즉, 데이터를 유지할 필요가 없습니다.) 스털링은 유망 해 보인다. 더 조사 할 것이다. – ckoo

+0

스털링을 살펴보고 거래 차단기 인 데이터베이스에 개체를 저장하기 위해 기본 클래스에서 상속해야합니다. 같은 줄에있는 것은 기본 클래스를 필요로하지 않는 [NDatabase] (http://ndatabase.codeplex.com/)입니다. 그것은 내가 원래 원했던 것처럼 민첩하고 표현이 현명하지 못하다. 그러나 나는 그것을 끈기있는 OOD로 테스트 해왔고 매우 만족하고있다. – ckoo

0

Lucene.NET을 사용할 수도 있습니다. Lucene.NET은 메모리에서 완전히 실행할 수도 있습니다 (그러나 내가 원하는 것은 아닙니다). 필드 기준에 따라 문서의 번개 빠른 검색을 지원합니다.

실제로 문서 데이터베이스를 제공합니다. 한 단계 더 나아가면 RavenDB (상업용)와 같은 것으로 끝납니다.

0

각 인덱싱 된 속성에 대해 SortedDictionary를 생성하여이 작업을 수행 할 수 있는지 궁금합니다.

SortedDictionary<property, List<MyClass>> 

그런 다음 Linq 식 트리를 구문 분석하여 어떤 속성이 쿼리되고 있는지 찾습니다. sortedDictionaries의 유효한 키를 검색 한 다음이 키를 반복하여 각 정렬 된 사전 목록을 가져온 다음 표현 트리에 OR 지시문이 있는지 여부에 따라 Union() 및 Intersect()와 같은 Set 연산을 사용할 수 있습니다. 그런 다음 검색 기준과 일치하는 목록을 반환하십시오.

쿼리에 인덱싱되지 않은 속성이 포함되어 있으면 먼저 인덱싱 된 속성을 사용하여 쿼리를 실행 한 다음 일반 Linq를 사용하여 쿼리를 끝냅니다.

재미있는 비트가 표현 트리를 구문 분석하게됩니다.

이 접근법에 대한 의견이 있으십니까?

+0

이 코드 플렉스 프로젝트는 이러한 필요성을 해결하는 것으로 보인다 : https://indexedlist.codeplex.com/ – ckoo

1

RaptorDB도 살펴 봐야합니다. CodeProject here에는 완전히 내장 된 버전을 비롯한 여러 버전이 있습니다.

관련 문제