从SQL结果中填充对象

时间:2013-06-18 08:50:22

标签: c# sqlite windows-phone-8

我有一个名为“vehicle”的常规C#类,其名称包括Name,NumberPlate,MaxSpeed等。 该类的所有数据都存储在SQLite数据库中,其中我有一个表“Car”和“Boat”。表colums与类属性具有相同的名称(但是,列属性多于类属性 - vehicle是更通用的抽象)。目前,我必须逐个分配查询结果,如下所示:

while (await statement.StepAsync())
{
myVehicle.Name = statement.Columns["Name"];
//[...]
myVehicle.MaxSpeed = decimal.TryParse(statement.Columns["MaxSpeed"]);
}

此外,我必须检查是否存在某些列(“Car”和“Boat”具有不同的列集),这比我想要的代码更多。

我读到了关于将我的数据库表映射到我的类的EntityFramework - 但这似乎有点过分了。我的要求是映射具有相同名称的属性和列,并忽略其他所有内容。 是否有“简单”(开发时间,代码行)方式将我的表列映射到我的类?

感谢阅读!

2 个答案:

答案 0 :(得分:0)

手机8中的限制意味着很多标准都会回答这个问题("只需使用{some ORM / micro-ORM}")申请,因为他们在电话8上没有工作。你可以使用反射来做很多事情,但是:反思可能(相对)慢,所以这取决于你有多少数据将处理。如果它是偶然的和轻的:好的,反射掉。

运行时元编程(图书馆使用的技巧,例如" dapper"在完整的.NET中使这些事情变得非常快)在限制运行时不可用,所以如果你想避免大量的锅炉 - 留下构建时元编程的板块。最简单的是,我想知道你是否可以使用像T4这样的东西来为C#自动创建这些方法。还有 方法也可以使用reflection-emit API为手机8构建程序集(在构建时),但这是一条相当硬核的路径。

我的想法:

  • 如果这里的类型数量不大,只需编写代码
  • 如果您有 lot 类型,或者您只是想要它,请考虑构建时代码生成元编程步骤;你甚至可能会想,嗯,这是我能为社区提供的东西吗?"
    • 当然,要做的第一件事就是检查这样的事情是否已经存在

答案 1 :(得分:0)

有一些 helper 可能适合您的情况。基本上,它将采用字典并尝试使用反射填充对象属性。我自己也没试过。

您只需执行以下操作:

while (await statement.StepAsync())
{
    myVehicle = DictionaryToObject<Car>(statement.Columns);
}

可能需要一些进一步的工作来使其运行,但也许是一个良好的开端。