【问题标题】:How can I get data type of each column in a SQL Server table/view etc. using C# Entity Framework?如何使用 C# Entity Framework 获取 SQL Server 表/视图等中每一列的数据类型?
【发布时间】:2015-01-22 22:30:44
【问题描述】:

如何使用实体框架获取 SQL Server 表或视图中每一列的类型?

我需要这样做之前我从表中获取所有数据,因为我希望允许用户过滤,例如,从实际从 SQL Server 检索数据之前的日期开始表/视图。

因此,如果我有一个带有发布日期的 Books 表,我想返回每一列(名称、发布者、发布日期)类型,以便事先进行过滤。我需要此代码来执行此操作,因为我不一定知道列,因为用户可能使用几个不同的表。

.NET Framework 类型就可以了,我不需要 SQL Server 类型...

下面是一些示例代码:

using (var ArgoEntities = new ARGOEntities())
{
    //find the types here before the user performs the query so i can build the below code
    var query = from b in ArgoEntities.tbl_Books
                where b.PublishDate>[user specified date]  //some date here the user enters
                select b;

    var book = query.First();
}

编辑:到目前为止,我只能通过获取表中的第一条记录来做到这一点,就像这样......

      using (ARGOEntities ArgoEntities = new ARGOEntities())
        {
            //var fred = typeof(ARGOEntities).GetProperties();
            //var fred = ArgoEntities.GetType().GetProperties();

            var a=ArgoEntities.tbl_Books.FirstOrDefault();
            var b = ObjectContext.GetObjectType(a.GetType());
            var c=b.GetProperties();
        }

但我再说一遍,我不想先获取任何记录。

【问题讨论】:

  • 在 EF 中,参见示例 6:scip.be/index.php?Page=ArticlesNET24。在普通的 ADO.NET 中做起来要简单得多。
  • 你甚至不需要说实话。因为在 EF 中,你有模型代表所有将要返回的数据。所以你可以只使用 typeof(SomeModel) 然后对带有 EF Column 属性标记的属性使用 Type.GetProperties() ,你将拥有所有属性以及它们的类型,用于填充表单 sql。
  • 另请参阅 SQL Server 管理对象 (msdn.microsoft.com/en-us/library/ms162557.aspx),了解您确实想要检查表和列但又没有 EF 模型的情况。
  • @Ryios 你能举个例子吗?我不知道 SomeModel 是什么,请用我的例子。

标签: c# sql sql-server entity-framework metadata


【解决方案1】:

您可以使用GetProperty,然后使用PropertyType

using (var ArgoEntities = new ARGOEntities())
        {
            //find the types here before the user performs the query so i can build the below code
            //Like this you can retrieve the types:
            foreach (string propertyName in ArgoEntities.CurrentValues.PropertyNames)
            {
                   var propertyInfo = ArgoEntities.Entity.GetType().GetProperty(propertyName);
                   var propertyType = propertyInfo.PropertyType;

            }
            //
            var query = from b in ArgoEntities.tbl_Books
                        where b.PublishDate>[user specified date]  //some date here the user enters
                        select b;

            var book = query.First();
        }

【讨论】:

  • 谢谢。 ArgoEntities.CurrentValues.PropertyNames 引发错误,指出 CurrentValues 未定义并且没有扩展方法 CurrentValues。我需要添加参考或其他内容吗?
  • 我假设我至少需要指定表格或其他内容,然后才能在表格中获取每个字段的属性...
  • 这就是我们要解释的...模型直接表示一个表。EF 将数据库中的所有表映射到数据层中的一个类。所以在一个简单的场景中,ArgoEntities 可能是一个名为 ArgoEntities 的表......例如在我的项目中,我有一个名为 People 的表,它映射到一个名为 Person 的类。我不必告诉它该表,因为 Person 是为 People 表创建的。因此,如果我获得 Person 类的属性,它们直接表示 People 表上的列。这只是自动的。
【解决方案2】:

Ryios 的评论让我得到了一个非常简单的答案,我知道它必须是,这将为我提供表中每个字段的 PropertyInfo 数组。

var columns=typeof(tbl_Books).GetProperties();

【讨论】:

  • 我已经发布了一个替代解决方案here,以防您想使用 EF 元数据。它当然不像你的那么简单,但有时反射不是一种选择。
猜你喜欢
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 2017-10-19
  • 2013-03-11
相关资源
最近更新 更多