在 OrmLite 中需要注意的重要一点是查询的构造和执行方式与结果的映射方式无关。无论查询是原始自定义 SQL 还是 Typed SQL 表达式都没有关系,OrmLite 只查看返回的数据集以锻炼结果应如何映射。
因此,当使用 Select<T>(SqlExpression<T>) API 时,OrmLite 将始终尝试将结果映射到 db.From<DeptEmployee>() 中的主 SqlExpression 类型,这不是您想要的,因为您选择的自定义列与形状不匹配来自DeptEmployee POCO。
有几种不同的方法可以读取自定义架构,它们都适用于相同的查询(因为它独立于您选择映射结果的方式):
var q = db.From<DeptEmployee>()
.Join<Department2>()
.Select<DeptEmployee, Department2>(
(de, d2) => new { de.FirstName, de.LastName, d2.Name });
我们的建议,尤其是。对于像 OrmLite 这样的类型化代码优先 ORM 是创建一个类型化自定义 POCO 并选择它,例如:
class Custom
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Name { get; set; }
}
db.Select<Custom>(q).PrintDump();
这会打印出漂亮的:
[
{
FirstName: First 1,
LastName: Last 1,
Name: Dept 1
},
]
主要好处是您可以在List<Custom> 中获得对自定义结果的类型访问权限。
如果您不想创建自定义类型,可以选择 OrmLite 的Dynamic Result APIs,例如:
如果您很高兴知道不同字段的位置,您可以选择List<object>,它将按照选择的顺序返回所选字段,例如:
db.Select<List<object>>(q).PrintDump();
打印:
[
[
First 1,
Last 1,
Dept 1
],
]
否则,如果您还希望返回名称,则可以选择字符串对象字典,例如:
db.Select<Dictionary<string,object>>(q).PrintDump();
其打印结果类似于自定义 POCO,但名称和对应值保存在松散类型的对象字典中:
[
{
FirstName: First 1,
LastName: Last 1,
Name: Dept 1
},
]
如果您只选择 2 列,例如:
var q = db.From<DeptEmployee>()
.Join<Department2>()
.Select<DeptEmployee, Department2>(
(de, d2) => new { de.LastName, d2.Name });
您可以使用 OrmLite 的 convenient data access APIs,它可以让您在 Dictionary<string,string> 中选择 2 列,例如:
db.Dictionary<string,string>(q).PrintDump();
哪些打印:
{
Last 1: Dept 1,
Last 2: Dept 2,
Last 3: Dept 3
}
请注意,这与上面的字符串对象字典非常不同,因为它返回结果为单个 Dictionary<string,string>for all rows 而不是 List<Dictionary<string,object>>,其中每个行都有一个 Dictionary 。
同样,如果您只选择 1 个字段,例如:
var q = db.From<DeptEmployee>()
.Join<Department2>()
.Select(x => x.LastName);
然后您可以在List<string> 中选择一列结果,例如:
db.Column<string>(q).PrintDump();
哪些打印:
[
Last 1,
Last 2,
Last 3
]
如果您想要不同的结果,您可以在 HashSet<string> 中返回它们:
db.ColumnDistinct<string>(q).PrintDump();
回到最初的重点,查询的构造方式无关紧要(它只控制生成的SQL),OrmLite 只查看返回的结果集来映射结果,它会尝试映射到您指定要将结果映射到的目标 API,因此执行自定义 SQL:
db.Column<string>("SELECT LastName FROM DeptEmployee").PrintDump();
或者如果你执行了一个存储过程:
db.Column<string>("EXEC GetLastNamesFromDeptEmployees").PrintDump();
如果您使用类型化的 SQL 表达式,其映射方式完全相同,即 OrmLite 仅查看它映射到您希望返回结果的方式的结果集。