Запрос по типу в DB4O - PullRequest
       36

Запрос по типу в DB4O

4 голосов
/ 22 июня 2009

Как передать тип класса в функцию в 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);
    }

Ответы [ 4 ]

11 голосов
/ 22 июня 2009

Есть два пути. Первый - явно использовать тип 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);
5 голосов
/ 22 июня 2009

Ответы, данные Джоном, Джаредом и Ишудителу, используют запрос за примером, который в основном не использует механизм запросов 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 в лучшем случае некрасиво.

1 голос
/ 22 июня 2009

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

public static void PrintAllPilots(Type classType, string pathToDb)
{
    IObjectContainer db = Db4oFactory.OpenFile(pathToDb);
    IObjectSet result = db.QueryByExample(classType);
    db.Close();
    ListResult(result);
}
0 голосов
/ 22 июня 2009

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

public static void PrintAllPilots(Type type, string pathToDb)

Или вы можете использовать обобщения для вывода типа:

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