当前位置: 首页 > 面试题库 >

在实体框架中按子列表的第一项对集合进行排序

倪德业
2023-03-14
问题内容

是否可以IQueryable通过子集合对集合进行排序?

例如,我有一个Books收藏。我也有一个Authors具有column的集合BookId,所以BookIdAuthors表中的外键。这种关系是一对多的(一本书很多作者)。

我需要Books按第一作者对收藏进行排序。这本书不需要有作者。可以在Entity Framework和Linq中完成吗?


问题答案:

您的具体问题的答案(在澄清了 作者应按姓名排序,图书集合按先前排序的作者名单排序后 )是这样的:

var query = db.Books
    .OrderBy(b => b.Authors.OrderBy(a => a.Name).Select(a => a.Name).FirstOrDefault());

这将生成一个单个SQL查询,如下所示:

SELECT
    [Project2].[Id] AS [Id],
    [Project2].[Title] AS [Title]
    FROM ( SELECT
        [Extent1].[Id] AS [Id],
        [Extent1].[Title] AS [Title],
        (SELECT TOP (1) [Project1].[Name] AS [Name]
            FROM ( SELECT
                [Extent2].[Name] AS [Name]
                FROM [dbo].[Author] AS [Extent2]
                WHERE [Extent1].[Id] = [Extent2].[BookId]
            )  AS [Project1]
            ORDER BY [Project1].[Name] ASC) AS [C1]
        FROM [dbo].[Book] AS [Extent1]
    )  AS [Project2]
    ORDER BY [Project2].[C1] ASC

请注意,不含作者的书籍将排在第一位。

另一种方法是使用Min函数:

var query = db.Books
    .OrderBy(b => b.Authors.Min(a => a.Name));

用SQL翻译:

SELECT
    [Project1].[Id] AS [Id],
    [Project1].[Title] AS [Title]
    FROM ( SELECT
        [Extent1].[Id] AS [Id],
        [Extent1].[Title] AS [Title],
        (SELECT
            MIN([Extent2].[Name]) AS [A1]
            FROM [dbo].[Author] AS [Extent2]
            WHERE [Extent1].[Id] = [Extent2].[BookId]) AS [C1]
        FROM [dbo].[Book] AS [Extent1]
    )  AS [Project1]
    ORDER BY [Project1].[C1] ASC


 类似资料:
  • 我有这样一个情况: 我必须对进行排序,该列表还包含的ID,排序必须为: null

  • 问题内容: Python通过按顺序查看元组的元素来对元组列表进行排序。由于集合是无序的,Python如何对集合列表进行排序? 编辑:帖子中的问题和可接受的答案较为笼统,给出的文件也很深入。我的问题不是重复的。 问题答案: 无论列表中有什么内容,元素的方法都是唯一参考的比较方法。对于集合,意味着“是”的适当子集,不足以定义总顺序。这就是为什么结果通常是不确定的。可能是原始列表的任何排列,与实现恰好适

  • 问题内容: 我有一个元组列表,看起来像这样: 我想按元组内的整数值将此列表升序排序。可能吗? 问题答案: 尝试将key关键字与一起使用。 应该是一个标识如何从数据结构中检索可比较元素的函数。在你的情况下,它是元组的第二个元素,因此我们访问。 要进行优化,请参阅的响应,使用,它实际上是的更快版本]。

  • 考虑一个域,其中客户、公司、雇员等拥有一个ContactInfo属性,该属性又包含一组地址、电话、电子邮件等。 以下是我的缩写联系人信息: 一些注意事项(我不是100%确定这些是否是EF的“最佳实践”): 地址集合是虚拟的,以允许延迟加载 集合上的私有设置器禁止集合替换 集合是一个以确保每个联系人没有重复的地址 使用方法,我可以确保始终且最多有一个主地址.... 我希望(如果可能)阻止通过方法添加

  • 问题内容: 我需要对一个包含每个人年龄的数组列表进行排序,但是我必须打印出一个65岁以上的人的列表。我知道如何用SQL而不是Java来做到这一点。任何帮助,将不胜感激。谢谢! 问题答案: 首先,请确保您已充分说明了问题,然后考虑首先要使用的算法(不是特定于语言的);然后实施算法。 如果问题仅在于列出年龄在65岁以上(不是65岁或65岁以上)的所有人员,则只需要遍历该数组,并针对每一行检查年龄是否符

  • 当我对它进行降序排序时,它应该首先显示Parent3,因为它有一个Z。这是我当前的hql,它得到了1>2>3的错误结果: 如果没有distinct,尽管它选择了多个相同的父级,但它仍然很好。 我有一个模型设置如下: 编辑:在集合中按HQL顺序对其进行排序,尽管当双亲具有相同的children.name值时,它不会比较下一个可能的值。即。 如果Parent1有孩子abba,zeon Parent2有