【问题标题】:LINQ ".Include" orderby in subquery子查询中的 LINQ“.Include” orderby
【发布时间】:2009-07-20 20:23:36
【问题描述】:

我有以下实体代码,它返回所有用户并“包含”他们的所有示例请求:

    var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests")
                           orderby u.LastName ascending
                           select u;

每个用户都有多个 SampleRequest。每个 SampleRequest 都有一个 ID#(只是一个整数:1、22、341 等)。上面的 LINQ to 实体抓取用户及其 SampleRequest,如下所示:

用户 1:33、22、341、12

用户 2:24、3、981

您可以看到 SampleRequest ID# 不是按升序排列的。我希望结果井井有条。

如何将 orderby 约束置于 Included SampleRequests ID#

请注意:SampleRequestId 是 SampleRequest 的属性...不是 User 对象的属性

【问题讨论】:

标签: linq-to-entities


【解决方案1】:

我目前可以想到两个选项来满足您的需求。您可以将它们选择到一个新类中,其中用户和相关请求是属性:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests")
                orderby u.LastName ascending
                select new
                {
                    User = u,
                    SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId)
                };

如果您想返回此类型,这将导致问题,因为它是匿名的。

你也可以选择这个成一个新的用户对象,类似这样:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests")
                orderby u.LastName ascending
                select new User
                {
                    Property1 = u.Property1,
                    Property2 = u.Property2,
                    Property3 = u.Property3,
                    SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId).ToList()
                };

这将返回用户对象的集合,但更新数据库中的对象可能会导致问题。

【讨论】:

  • 如果 User 是一个 EF 实体,您不能将 OrderByDescending().ToList() 调用的结果(一个 List)分配给 User 的 SampleRequests 属性,因为它的类型是 EntityCollection 。另外,我会警惕手动分配查询中的每个属性;如果您稍后将新属性添加到 User 并忘记更新所有查询,您将获得没有分配该属性的 User 实例。 IMO 它可能是一个维护 PITA。
  • 如果你的 User-class 有很多属性,我觉得这很丑。这个 subcollection.ToList() 会在业务逻辑和 sql-server 之间进行大量传输吗?一种解决方案可能是直接获取 SampleRequests 而不是顺序,然后稍后在 c#-code (=memory) 中对它们进行排序。
  • 您应该为 UserSet.LastName 创建一个排序的数据库索引。另一个到 SampleRequests 与(UserSet 和 SampleRequestId 的外键)
【解决方案2】:

只需在 orderby 中添加另一个排序参数:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests")
                           orderby u.LastName ascending, 
                                   u.SampleRequestId descending
                           select u;

【讨论】:

  • 谢谢,但是 SampleRequestId 是 SampleRequests 包含的属性,而不是 User 对象的属性。
  • @John:对于您所描述的内容,这是我看到的唯一答案。我认为我们首先需要更多信息。
  • 好的,我重写了我的问题 - 我认为它可能更清楚一点
【解决方案3】:

编辑:由

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests")
                orderby u.LastName ascending, u.SampleRequestId descending
                select u;

【讨论】:

  • 谢谢,但是 SampleRequestId 是 SampleRequests 包含的属性,而不是 User 对象的属性。
猜你喜欢
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多