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);
}
解決
2つの方法があります。 1つ目は、Typeタイプを明示的に使用することです。
public static void PrintAllPilots(Type type, string pathToDb)
{
...
IObjectSet result = db.QueryByExample(type);
}
PrintAllPilots(typeof(SomeType),somePath);
2番目はジェネリックを使用することです
public static void PrintAllPilots<T>(string pathToDb)
{
...
IObjectSet result = db.QueryByExample(typeof(T));
}
PrintAllPilots<SomeType>(somePath);
他のヒント
Jon、Jared、およびyshuditeluによる回答は、ほとんど使用されていないDB4oクエリメカニズムであるquery-by-exampleを使用しており、将来的に非推奨になる可能性があります。
DB4O for .NETでのクエリの推奨方法は、ネイティブクエリと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 SODAクエリを使用できます。
var query = db.Query();
query.Constrain(someObj.GetType());
var results = query.Execute();
edit SODA、Query-by-Example(QBE)、またはNative Query(NQ)の代わりにLINQを使用する理由LINQを使用すると、クエリ式を実行することが非常に自然になるためです。たとえば、Michaelという名前のパイロットを照会する方法は次のとおりです。
var michaelPilots = from Pilot p in db
where p.Name == "Michael"
select p;
そしてLINQは構成可能です。つまり、次のようなことができます。
var first20MichaelPilots = michaelPilots.Take(20);
そして、結果を反復するときに、DB4Oで実行される効率的なクエリを取得できます。 SODA、QBE、またはNQで同じことを行うのはせいぜいatいです。
これはあなたが望むものだと思います:
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));
}
所属していません StackOverflow