【问题标题】:How to get some columns of entity in entity-framework?如何在实体框架中获取一些实体列?
【发布时间】:2014-04-14 23:12:14
【问题描述】:

假设我有一个包含超过 1000000 列的表。当我使用 LINQ To SQLEntity-Framework 时,所有查询都将用 c# 编写,如下所示:

EFContext.MyTableName.Where(row=>row.column1==someValue)
                     .Select(...)
                     .FirstOrDefault(...)
                     .Any(...)
                     ...

如何仅获取实体的某些列?例如,有什么方法可以在 1000000 列中仅获取第 1 列和第 2 列和第 3 列?

注意:

选择后结果数据的类型应保留,例如,如果未过滤某些列,结果类型为 Type1,过滤后结果类型为 Type1 非常重要,但过滤后的 Type1 属性的值应为 null 或默认。

【问题讨论】:

  • 你有 1000000 列或行?
  • 假设有 1000000 列,尽管这不是现实!

标签: c# sql linq entity-framework-6


【解决方案1】:

只获得几个 ROWS 你可以使用:

.Take(3);

仅获取您可以使用的某些列:

.Select(x => new MyType() { Column1 = x.Column1, Column2 = x.Column2 })

请注意,对象现在没有附加到对象上下文,因此它不会受到 SaveChanges() 的影响。但是您只选择了几列,类型仍然是正确的。

要获取您自己的默认值而不是变量类型的框架默认值,您可以修改构造函数类型以设置默认值。

【讨论】:

  • 不错的方法,但是这种方法对于 ABSTRACT 类有不足之处!没有办法创建抽象类的实例,你对这个新问题有什么建议?
  • 那将是另一个困难。您可以考虑更改代码,以便您选择的类型没有抽象类。或者也许这个解决方案适合你:stackoverflow.com/questions/3274241/…
  • 我读过那个解决方案和它的最佳答案,但是没有关于抽象类的东西。
  • 我根本无法更改代码中的模型!还有其他建议吗?!
  • 我想不出适合抽象类的方法。该链接确实与抽象类无关,而只是另一种可能满足您需求的解决方案。我不知道保持类型有多严格,但你可以制作一个实现你的抽象类的包装器类型。那么您可以将其用作: MyAbstractType1 inst = instance_of_MyWrapperType1
【解决方案2】:

据我所知,您在 Entity Framework 中获取列子集的唯一方法是创建一个新实体类,该类仅包含您感兴趣的列并将其映射到同一个表。然后,EF 在查询该实体时不会选择这些列。您还可以在需要时继续使用完整的实体 - 没有什么说您不能将两个实体类映射到同一个表。或三个。还是四个……

根据数据库定义,子集实体可能完全不足以在不违反约束的情况下插入或更新行,但它可能是一个非常有用的工具,可以减少您对选择进行的不必要的数据传输量,以及用大量不需要的列实现实体的时间损失(这可能非常重要)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2019-08-02
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多