2009-06-22 1 views
4

Как передать тип класса в функцию в C#?Запрос в DB4O

Как я получаю в 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); 
    } 

ответ

11

Есть два способа. Первый - явно использовать тип типа.

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); 
+0

Ударьте меня к дженерикам. Что дает бонус reusablility для ЛЮБОГО типа, хранящегося в db –

1

Я думаю, что это то, что вы хотите:

public static void PrintAllPilots(Type classType, string pathToDb) 
{ 
    IObjectContainer db = Db4oFactory.OpenFile(pathToDb); 
    IObjectSet result = db.QueryByExample(classType); 
    db.Close(); 
    ListResult(result); 
} 
0

Вы можете сделать это вручную с помощью Type:

public static void PrintAllPilots(Type type, string pathToDb) 

Или вы могли бы использовать дженерики определить тип:

public static void PrintAllPilots<T>(string pathToDb) 
{ 
    //... 
    var result = db.QueryByExample(typeof(T)); 
} 
5

ответы, предоставленные Джоном, Джаредом, и yshuditelu используют запрос по примеру, который в значительной степени неиспользуемый механизм запросов DB4o, и потенциально может быть устаревшим в будущем.

Предпочтительные методы запроса на DB4O для .NET - это родные запросы и LINQ.

// Query for all Pilots using DB4O native query: 
var result = db.Query<Pilot>(); 

Или же с помощью Linq-на-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(); 

редактировать Почему использовать LINQ вместо содовой, запроса по образцу (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 в лучшем случае уродливое.

+0

Я уже работал с LINQ и должен признать, что это глазные конфеты во всех аспектах. В следующем шаге будет вычитаться исходный запрос. Спасибо за совет! –

+0

Я изменил сообщение, чтобы объяснить, почему LINQ желательно. –