Consultando por tipo em DB4O
-
06-07-2019 - |
Pergunta
Como você passar um tipo de classe para uma função em C #?
Como estou recebendo em db4o e C # Eu escrevi a seguinte função depois de ler os tutoriais:
public static void PrintAllPilots("CLASS HERE", string pathToDb)
{
IObjectContainer db = Db4oFactory.OpenFile(pathToDb);
IObjectSet result = db.QueryByExample(typeof("CLASS HERE"));
db.Close();
ListResult(result);
}
Solução
Existem duas maneiras. A primeira é usar explicitamente o tipo Type.
public static void PrintAllPilots(Type type, string pathToDb)
{
...
IObjectSet result = db.QueryByExample(type);
}
PrintAllPilots(typeof(SomeType),somePath);
O segundo é genéricos de uso
public static void PrintAllPilots<T>(string pathToDb)
{
...
IObjectSet result = db.QueryByExample(typeof(T));
}
PrintAllPilots<SomeType>(somePath);
Outras dicas
As respostas dadas pelos por Jon, Jared, e yshuditelu uso consulta por exemplo, que é em grande parte não utilizada DB4O mecanismo de consulta, e poderia potencialmente ser obsoleto no futuro.
Os métodos preferidos de consultando DB4O for .NET é consultas nativas e LINQ.
// Query for all Pilots using DB4O native query:
var result = db.Query<Pilot>();
Ou, alternativamente usando Linq-to-DB4O:
// Query for all Pilots using LINQ
var result = from Pilot p in db
select p;
Ambos trabalho desde que você saiba o tipo (por exemplo Pilot) em tempo de compilação. Se você não sabe o tipo em tempo de compilação, você pode sim usar uma consulta DB4O SODA:
var query = db.Query();
query.Constrain(someObj.GetType());
var results = query.Execute();
editar Por que usar LINQ em vez de refrigerante, o Query-by-Example (QBE), ou Native consulta (NQ)? Porque LINQ torna muito natural para fazer consulta expressões. Por exemplo, aqui está como você pode consultar para pilotos nomeados Michael:
var michaelPilots = from Pilot p in db
where p.Name == "Michael"
select p;
E LINQ é combináveis, o que significa que você pode fazer coisas como esta:
var first20MichaelPilots = michaelPilots.Take(20);
E você ainda vai receber uma consulta eficiente executado em DB4O quando você iterar sobre os resultados. Fazer o mesmo no refrigerante ou QBE ou NQ é feio na melhor das hipóteses.
Eu acho que isso é o que você quer:
public static void PrintAllPilots(Type classType, string pathToDb)
{
IObjectContainer db = Db4oFactory.OpenFile(pathToDb);
IObjectSet result = db.QueryByExample(classType);
db.Close();
ListResult(result);
}
Você pode fazê-lo manualmente usando Type
:
public static void PrintAllPilots(Type type, string pathToDb)
Ou você poderia usar genéricos para inferir o tipo:
public static void PrintAllPilots<T>(string pathToDb)
{
//...
var result = db.QueryByExample(typeof(T));
}