在DB4O中按类型查询

4

如何在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
有两种方法。第一种是明确使用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);

赶在我之前使用泛型。这将为存储在数据库中的任何类型提供额外的可重用性奖励。 - Chad Ruppert

5

Jon、Jared和yshuditelu所给出的答案使用的是“按示例查询”的方法,这是DB4o中很少使用的查询机制,并且在未来可能会被弃用。

在.NET上查询DB4O的首选方法是本地查询和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();

编辑 为什么要使用LINQ而不是SODA、Query-by-Example(QBE)或Native Query(NQ)?因��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中进行相同操作最多只能算是丑陋的。


我已经使用过LINQ,并且必须承认它在所有方面都是一种令人愉悦的体验。下一步将深入研究本地查询。感谢您的建议! - Faizan S.
我修改了这篇文章以解释为什么 LINQ 是可取的。 - Judah Gabriel Himango

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));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接