【问题标题】:LINQ subselect in table with composite key具有复合键的表中的 LINQ 子选择
【发布时间】:2011-05-12 14:39:56
【问题描述】:

我在通过实体框架查询访问的数据库中有一个设置表。 这些设置有一个复合键:Category、Group、Name、Target、Modified。 这些设置显然还包含非关键字段,如 value。

我将如何编写一个查询以提供同一(类别、组、名称、目标)内的最新设置?

更具体地说,我想要匹配特定类别、组、目标组合的所有最新设置实体,包括非关键字段。

例如:给我所有目标的所有最新设置,其中 Category 是“Database”,Group 是“Timeout”。

这可以分两步完成,初始查询返回与条件匹配的所有 [Category, Group, Name, Target, Modified] 键,然后循环查询每个键的设置,但这会产生很多数据库查询,产生开销。

如果我想尽量减少框架执行的 SQL 数据库查询的数量,我将如何使用 LINQ 执行此操作?

【问题讨论】:

    标签: c# sql linq entity-framework linq-to-entities


    【解决方案1】:
    var query = from s in db.Settings
                group s by new
                {
                  s.Category,
                  s.Group,
                  s.Name,
                  s.Target,
                } into sg
                select new
                {
                  Setting = sg.OrderByDescending(r => r.Modified).FirstOrDefault()
                };
    

    编辑 - 如果您想返回设置列表

     List<Setting> list = (from s in db.Settings
                           group s by new
                           {
                             s.Category,
                             s.Group,
                             s.Name,
                             s.Target,
                           } into sg
                           select sg.OrderByDescending(r => r.Modified).FirstOrDefault()
                          ).ToList();
    

    【讨论】:

    • 据我所知,这只会返回设置的关键字段列表。我需要完整的设置实体(包括值、描述、权限等非键字段),而不仅仅是复合键。如果我的问题不清楚,我很抱歉。
    • 我已经修改了我的问题,以便更清楚我想要什么。
    • @Holstebroe - 我的回答返回整个设置实体
    • 我以为我没有得到整个设置实体,因为我使用了 sb.Settings.Include("Description") 来加载关联的描述实体。包含似乎不适用于组查询。
    【解决方案2】:

    尝试使用以下 LINQ 语句。

            List<Settings> latestSettings = 
                db.Settings.OrderByDescending(x => x.Modified).GroupBy(x => new {x.Category, x.Group, x.Name, x.Target}, x => x)
                .Select(result => result.FirstOrDefault())
                .ToList();
    

    【讨论】:

    • 嗨,这只是给我设置键。这是一个好的开始,但我还需要设置实体中的其余字段。
    • 您好 Holstebroe,请自行尝试。结果不仅是复合键,还有其他非键值。
    • 根据我的 L2E 经验,如果 OrderBy 在 GroupBy 之前,它会被忽略
    • @aducci:您可能是对的,我将不得不重试。但无论是我的还是你的 sql 都应该可以正常工作。
    • 你也是对的,你的查询返回了整个设置。谢谢。
    猜你喜欢
    • 2018-02-16
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2014-07-31
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多