【问题标题】:Entity Framework creating IQueryable of the most recent实体框架创建最新的 IQueryable
【发布时间】:2009-08-13 17:27:28
【问题描述】:

我有一个实体集,该实体集具有包含 ID (GUID) 和 CreatedAt (DateTime) 的复合键的实体。此 CreatedAt 是创建实体的时间。每个记录代表每个实体的每个版本,因此多个记录可以具有相同的 ID。

我想创建一个可重复使用的 IQueryable-returning 方法,以便它只返回所请求实体的最新版本,但我正在努力寻找答案(如果确实有答案)。

我知道我可以写一个查询比如

(from e in context.Entities where e.ID = myID orderby e.CreatedAt).FirstOrDefault();

但我希望能够这样做:

(from e in context.GetCurrentEntities() where e.ID = myID).FirstOrDefault();

这样它只会返回所需实体的最新版本。

这可行吗?

非常感谢您的帮助。

【问题讨论】:

  • dahlbyk 和 Craig Stuntz 已经为您提供了有关您正在尝试做的事情的正确答案。 +1 伙计们。我在想,看看编译的查询在性能方面是否更适合你。另外,我推荐 RP 是因为上下文类有责任提供 IMO 不应赋予上下文的功能。

标签: linq entity-framework


【解决方案1】:

如果您按 ID 分组,则可以使用以下方式仅从每个组中选择最新的:

public IQueryable<Entity> GetCurrentEntities()
{
    return from e in this.Entities
           group e by e.ID into g
           select g.OrderByDescending(e => e.CreatedAt).First();
}

您不需要FirstOrDefault(),因为除非群组中至少有一个Entity,否则不会创建群组。

【讨论】:

    【解决方案2】:

    怎么样:

    public partial class MyEntities // or whatever you call your ObjectContext
    {
        public IQueryable<Entity> GetCurrentEntities()
        {
            return from e in context.Entities 
                   group e by e.ID into g
                   from ge in g
                   orderby ge.CreatedAt desc
                   select ge.First();
        }
    }
    

    这不是我的想法,但它应该让你开始。

    【讨论】:

    • 谢谢 - 这是否等同于 dahlbyk 的解决方案,还是有不同的结果?
    【解决方案3】:

    我认为您正在查看较小的图片。您是否考虑过实现存储库模式?LINK 否则查看您的需求,您需要将此 GetCurrentEntities 方法添加到您的上下文类中。

    【讨论】:

    • 嗨 Perpetualcoder 感谢您的建议。我们花了很多时间研究如何在当前项目中继续使用 EF。我发现 EF 妨碍了太多。在查看了选项(其他 ORM、手动编码的 DAL)之后,我们正在使用 EF 并将其用作“类型安全”的 SQL,并避免使用它的所有其他“功能”。存储库模式在这里有什么优势?你是对的,我的意图是将 GetCurrentEntities() 添加到 DataContext。
    • 存储库模式使得在您对控制器进行单元测试时将 EF 换成模拟存储库变得很简单。
    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多