Запрос по типу в 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);
}
Решение
Есть два пути. Первый - явно использовать тип Type.
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);
Другие советы
В ответах Джона, Джареда и Ишудителу используется запрос за примером, который в основном не использует механизм запросов DB4o и в будущем может быть устаревшим. Р>
Предпочтительными методами запросов к DB4O для .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;
Обе эти работы при условии, что вы знаете тип (например, Pilot) во время компиляции. Если вы не знаете тип во время компиляции, вы можете вместо этого использовать запрос DB4O SODA:
var query = db.Query();
query.Constrain(someObj.GetType());
var results = query.Execute();
edit Зачем использовать LINQ вместо SODA, Query-by-Example (QBE) или Native Query (NQ)? Потому что LINQ делает очень естественным делать выражения запросов. Например, вот как бы вы запросили пилотов по имени Майкл:
var michaelPilots = from Pilot p in db
where p.Name == "Michael"
select p;
И LINQ является составным, что означает, что вы можете делать такие вещи:
var first20MichaelPilots = michaelPilots.Take(20);
И вы по-прежнему получите эффективный запрос, выполняемый в DB4O, когда будете повторять результаты. Делать то же самое в SODA, 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));
}