OrmLite查询以从2个联接表的每一个中选择一些列

EM0

此注释之后,如何执行一个ServiceStack OrmLite查询,该查询将两个或多个表连接在一起并从每个表中返回一些列?

以OrmLiteDoes_only_populate_Select_fields_wildcard单元测试为例,我想做这样的事情:

public class DeptEmployee
{
    [PrimaryKey]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [References(typeof(Department2))]
    public int DepartmentId { get; set; }

    [Reference]
    public Department2 Department { get; set; }
}

public class Department2
{
    [PrimaryKey]
    public int Id { get; set; }
    public string Name { get; set; }
}

var q = db.From<DeptEmployee>()
    .Join<Department2>()
    .Select<DeptEmployee, Department2>((de, d2) => new[] { de.FirstName, de.LastName, d2.Name });
var results = db.Select(q);

上面没有像我期望的那样返回包含名字,姓氏和名字的匿名类型的列表。它仍然返回DeptEmployee对象列表(但仅填充FirstName和LastName)。

神话

在OrmLite中要注意的重要事项是查询的构造和执行方式与结果的映射方式无关。查询是原始的自定义SQL还是类型化的SQL表达式都无关紧要,OrmLite仅查看返回锻炼的数据集应如何映射结果。

因此,在使用Select<T>(SqlExpression<T>)API时,OrmLite将始终尝试将结果映射到主要的SqlExpression Type中db.From<DeptEmployee>(),这不是您想要的类型,因为您选择的自定义列与DeptEmployeePOCO的形状不匹配

有几种不同的方式来读取自定义架构,它们都可以在同一个查询中运行(因为它独立于您选择的映射结果的方式):

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
    },
]

主要的好处是您可以在中获得对自定义结果的Typed访问List<Custom>

如果您不想创建自定义类型,则可以选择OrmLite的动态结果API,例如:

如果您很高兴知道不同字段的位置,则可以选择一个List<object>,它将按照选定字段的顺序返回选定的字段,例如:

db.Select<List<object>>(q).PrintDump();

印刷:

[
    [
        First 1,
        Last 1,
        Dept 1
    ],
]

否则,如果您还希望返回名称,则可以选择一个字符串对象字典,例如:

db.Select<Dictionary<string,object>>(q).PrintDump();

该命令的打印结果类似于“自定义POCO”,但名称和相应的值保留在一个松散类型的对象Dictionary中:

[
    {
        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的便捷数据访问API,使您可以在中选择2列Dictionary<string,string>,例如:

db.Dictionary<string,string>(q).PrintDump();

哪些打印:

{
    Last 1: Dept 1,
    Last 2: Dept 2,
    Last 3: Dept 3
}

注意,这与上面的字符串对象字典非常不同,因为它对Dictionary<string,string> 所有行返回结果,而不是对每行返回List<Dictionary<string,object>>一个字典

同样,如果您仅选择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仅查看其映射到您希望返回结果的方式的结果集。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

连接两个数据框,从一个中选择所有列,并从另一个中选择一些列

来自分类Dev

MySQL查询,用于从两个表中选择和计数一些字段

来自分类Dev

如何在cakephp 3.6中从一个表中选择所有记录并从另一个表中选择一些记录

来自分类Dev

如何基于一个键加入2个文件并选择一些特定的列?

来自分类Dev

如何从一个mySQL innodb表中选择/联接一些数据到另一个(没有重复项),并选择每个ID的最后插入的行

来自分类Dev

MySQL从多个表中选择值取决于一个中的最新值

来自分类Dev

SQL查询以基于另一个表中的列值从一个表中选择

来自分类Dev

从选择查询中的另一个表中选择列

来自分类Dev

如何在R中另一个数据集的列中选择一个数据集中的一些行?

来自分类Dev

numpy:从N个离散概率分布的每一个中随机选择1个样本

来自分类Dev

联接2个表并从第一个表中获取一些列,并从第二个表中获取最大时间戳值

来自分类Dev

SQL查询以从一个表中选择所有行,并从表2中选择行

来自分类Dev

您好,目前正在学习,我需要一些帮助。我需要编写一个查询,该查询将返回一个包含选择列的表

来自分类Dev

如何从组查询的列中选择一个值

来自分类Dev

如何从组查询的列中选择一个值

来自分类Dev

在一个表上联接多个查询并获得一个选择结果

来自分类Dev

从选定的一个中选择下一个单选按钮

来自分类Dev

Laravel 4从子查询中的另一个表中选择列

来自分类Dev

从表中选择多个列,但按一个分组

来自分类Dev

从另一个表中选择一个查询的结果

来自分类Dev

从一个表中选择所有列,从另一个表中选择 1 列

来自分类Dev

根据另一个表的频率从一个表中选择列?

来自分类Dev

仅使用一个表中的ID从一个表中选择数据(联接?)

来自分类Dev

在一个查询中从两个表中选择一个记录,并从另一个表中选择多个记录

来自分类Dev

从一个表中选择查询以检查列中是否存在相同的值,mysql选择查询

来自分类Dev

从多个表中选择并左联接到一个表

来自分类Dev

连接多个表,从不同的表中选择计数,然后在一个查询中按一列分组

来自分类Dev

MySQL查询从多个表中选择,显示所有来自表1 +一些数据来自表2

来自分类Dev

连接两个pyspark数据帧以从第一个df中选择所有列,并从第二个df中选择一些列

Related 相关文章

  1. 1

    连接两个数据框,从一个中选择所有列,并从另一个中选择一些列

  2. 2

    MySQL查询,用于从两个表中选择和计数一些字段

  3. 3

    如何在cakephp 3.6中从一个表中选择所有记录并从另一个表中选择一些记录

  4. 4

    如何基于一个键加入2个文件并选择一些特定的列?

  5. 5

    如何从一个mySQL innodb表中选择/联接一些数据到另一个(没有重复项),并选择每个ID的最后插入的行

  6. 6

    MySQL从多个表中选择值取决于一个中的最新值

  7. 7

    SQL查询以基于另一个表中的列值从一个表中选择

  8. 8

    从选择查询中的另一个表中选择列

  9. 9

    如何在R中另一个数据集的列中选择一个数据集中的一些行?

  10. 10

    numpy:从N个离散概率分布的每一个中随机选择1个样本

  11. 11

    联接2个表并从第一个表中获取一些列,并从第二个表中获取最大时间戳值

  12. 12

    SQL查询以从一个表中选择所有行,并从表2中选择行

  13. 13

    您好,目前正在学习,我需要一些帮助。我需要编写一个查询,该查询将返回一个包含选择列的表

  14. 14

    如何从组查询的列中选择一个值

  15. 15

    如何从组查询的列中选择一个值

  16. 16

    在一个表上联接多个查询并获得一个选择结果

  17. 17

    从选定的一个中选择下一个单选按钮

  18. 18

    Laravel 4从子查询中的另一个表中选择列

  19. 19

    从表中选择多个列,但按一个分组

  20. 20

    从另一个表中选择一个查询的结果

  21. 21

    从一个表中选择所有列,从另一个表中选择 1 列

  22. 22

    根据另一个表的频率从一个表中选择列?

  23. 23

    仅使用一个表中的ID从一个表中选择数据(联接?)

  24. 24

    在一个查询中从两个表中选择一个记录,并从另一个表中选择多个记录

  25. 25

    从一个表中选择查询以检查列中是否存在相同的值,mysql选择查询

  26. 26

    从多个表中选择并左联接到一个表

  27. 27

    连接多个表,从不同的表中选择计数,然后在一个查询中按一列分组

  28. 28

    MySQL查询从多个表中选择,显示所有来自表1 +一些数据来自表2

  29. 29

    连接两个pyspark数据帧以从第一个df中选择所有列,并从第二个df中选择一些列

热门标签

归档