DB4O 유형별 쿼리
-
06-07-2019 - |
문제
클래스 유형을 C#의 함수로 어떻게 전달합니까?
DB4O와 C#에 들어가면 튜토리얼을 읽은 후 다음 기능을 썼습니다.
public static void PrintAllPilots("CLASS HERE", string pathToDb)
{
IObjectContainer db = Db4oFactory.OpenFile(pathToDb);
IObjectSet result = db.QueryByExample(typeof("CLASS HERE"));
db.Close();
ListResult(result);
}
해결책
두 가지 방법이 있습니다. 첫 번째는 유형 유형을 명시 적으로 사용하는 것입니다.
public static void PrintAllPilots(Type type, string pathToDb)
{
...
IObjectSet result = db.QueryByExample(type);
}
PrintAllPilots(typeof(SomeType),somePath);
두 번째는 제네릭을 사용하는 것입니다
public static void PrintAllPilots<T>(string pathToDb)
{
...
IObjectSet result = db.QueryByExample(typeof(T));
}
PrintAllPilots<SomeType>(somePath);
다른 팁
Jon, Jared 및 Yshuditelu가 제공 한 답변은 거의 사용하지 않은 DB4O 쿼리 메커니즘 인 쿼리별로 사용되며 잠재적으로 미래에도 더 이상 사용되지 않을 수 있습니다.
.NET 용 DB4O에서 선호되는 쿼리 방법은 기본 쿼리 및 LINQ입니다.
// Query for all Pilots using DB4O native query:
var result = db.Query<Pilot>();
또는 대안 적으로 linq-to-db4o를 사용합니다.
// Query for all Pilots using LINQ
var result = from Pilot p in db
select p;
이 두 가지 작업은 컴파일 타임에 유형 (예 : 파일럿)을 알게 된 경우. 컴파일 시간에 유형을 모르는 경우 대신 DB4O 소다 쿼리를 사용할 수 있습니다.
var query = db.Query();
query.Constrain(someObj.GetType());
var results = query.Execute();
편집하다 소다 대신 LINQ, query-by-example (QBE) 또는 기본 쿼리 (NQ)를 사용하는 이유는 무엇입니까? LINQ는 쿼리 표현식을 수행하는 것이 매우 자연 스럽기 때문입니다. 예를 들어, Michael이라는 조종사를 쿼리하는 방법은 다음과 같습니다.
var michaelPilots = from Pilot p in db
where p.Name == "Michael"
select p;
LINQ는 합성 가능하므로 다음과 같은 작업을 수행 할 수 있습니다.
var first20MichaelPilots = michaelPilots.Take(20);
결과를 반복 할 때 DB4O에서 효율적인 쿼리가 여전히 실행됩니다. 소다 나 QBE 또는 NQ에서 동일하게하는 것은 가장 추악합니다.
나는 이것이 당신이 원하는 것이라고 생각합니다.
public static void PrintAllPilots(Type classType, string pathToDb)
{
IObjectContainer db = Db4oFactory.OpenFile(pathToDb);
IObjectSet result = db.QueryByExample(classType);
db.Close();
ListResult(result);
}
사용하여 수동으로 수행 할 수 있습니다 Type
:
public static void PrintAllPilots(Type type, string pathToDb)
또는 제네릭을 사용하여 유형을 추론 할 수 있습니다.
public static void PrintAllPilots<T>(string pathToDb)
{
//...
var result = db.QueryByExample(typeof(T));
}