【问题标题】:how do I return entities from delimited list of Ids in EF5 Code First如何从 EF5 Code First 中的 Id 分隔列表返回实体
【发布时间】:2013-03-03 14:45:31
【问题描述】:

我想通过使用 EF5 Code First 传入以逗号分隔的 Id 列表来混合实体集合。

我之前会在 t-sql 中创建一个表函数,传入逗号分隔的 Id 列表,然后将此表连接到目标表并返回我的记录集合。

使用 EF5 Code First 实现相同目标的最高效方式是什么?

更新:我想避免首先将完整的实体集放在内存中。

更新 2:理想情况下,我希望实体的顺序与分隔列表匹配。

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

    我会说首先将逗号分隔的列表转换为 List<int>,其中包含您要查找的所有 ID。此时,使用您特定的 DbContext 类,您将执行以下操作:

    var entities = db.MyEntities.Where(e => myListOfIds.Contains(e.ID)).ToList();
    

    注意:我只将ToList 放在最后,因为您在谈论为该系列补水。否则,使用 IEnumerable,查询的执行将被延迟,因此不会立即填充。

    【讨论】:

    • 这样就行了!谢谢。有没有办法将 List 的顺序保留在水合集合中,就像我的 t-sql 示例中的表连接一样?
    【解决方案2】:

    您可以这样做,通过检查实体对象的 ID 是否属于您的 ID 列表来限制实体对象集:

    // Dummy list of POCO 'entity' objects (i.e. the Code first objects) just for the sake of this snippet
    var entities = new List<Entity>();
    entities.Add(new Entity() { ID = 1, Title = "Ent1" });
    entities.Add(new Entity() { ID = 2, Title = "Ent2" });
    entities.Add(new Entity() { ID = 3, Title = "Ent3" });
    
    // List of ids to match
    var ids = new List<int>();
    ids.Add(1);
    ids.Add(2);
    
    // LINQ:
    var selected = (from e in entities where ids.Contains(e.ID) select e).ToList();
    

    为了完整起见,这是上面使用的虚拟类:

    // POCO (Code first) object
    private class Entity
    {
        public int ID { get; set; }
        public string Title { get; set; }
    }
    

    【讨论】:

    • 嗨,Alistair,您的解决方案不是意味着我必须首先在内存中拥有完整的实体集吗?试图避免这种情况,就像在 t-sql 解决方案中一样。抱歉,我的问题应该更清楚。
    • 啊抱歉 - 我正在设置一个示例来演示 Contains 关键字的使用。没说清楚是我的错。上面的 IronMan84 搞定了!
    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2014-02-19
    • 2012-08-14
    • 2013-01-28
    相关资源
    最近更新 更多