【问题标题】:Using Entity Framework, how to create a query which will fetch the column names of all tables from a database使用实体框架,如何创建一个查询,该查询将从数据库中获取所有表的列名
【发布时间】:2019-09-11 10:19:01
【问题描述】:

如何使用实体框架在 C# 中创建动态选择查询,该查询将从 SQL 数据库中获取所有列名。这里,要在查询中提供的表名是从IEnumerable<string> 类型的通用列表中获取的

有一个列表 mylist,其中索引 [0] 的表名称为 Store,在索引 [1] 处有一个表 Address,在 [2] 处有一个表 Country。现在,需要向数据库发起查询以找出StoreAddressCountry 表的所有列名。

我假设,最终的查询应该以下面的方式——

select    
    mylist[0].1stcolumnname,
    mylist[0].2ndcolumnname,
    .....,
    mylist[1].1stcolumnname,
    mylist[1].2ndcolumnname, ....,
    mylist[2].1stcolumnname,
    mylist[2].2ndcolumnname, 
    .... 
from 
    SOMETABLENAME WITH JOINS" 

如果正确获取了这些结果,则要触发的最终输出查询将类似于

Select 
    "Store.id", "Store.Name", "Store.gstno", "Store.addressId",  
    "Address.addressId", "Address.addressLine1", "Address.addressLine2", 
    "Address.postcode", "Address.countryId", 
    "Country.countryId", "Country.name"
from 
    SOMETABLENAME WITH JOINS;

正如您在此处看到的,每个表名和每个列名都被提取并创建了查询。

【问题讨论】:

  • 如果您在同一个项目中使用 EntityFramework 和原始 SQL 查询 - 您可能做错了什么
  • 没有。实际上,我必须使用实体框架从通用列表中获取表的列名并将它们放入列表中,以便可以对其进行索引以创建动态 select sql 查询,就像我在问题中提到的那样
  • 我不知道你所说的 "dynamic select sql query" 是什么意思,但是如果 EF Core 使用:var allSotresWithAddressesAndCountriesIncluded = dbContext.Stores.Include(s => s.Address).ThenInclude(a => a.Country).ToList();

标签: c# .net entity-framework ienumerable generic-list


【解决方案1】:

使用这个:

   using (var db = new EFDemoContext())
            {
                var columnNames = db.Database.SqlQuery<string>(" SELECT T.name + '.' + C.name AS Name
           FROM   sys.objects AS T
           JOIN sys.columns AS C ON T.object_id = C.object_id
           JOIN sys.types AS P ON C.system_type_id = P.system_type_id
           WHERE  T.type_desc = 'USER_TABLE'  and T.name not like  N'%sysdiagrams%';").ToList();
            }

【讨论】:

  • 不工作,列表应该有像 tablename.columnname 这样的值,所以如果我获取列表的索引,输出应该是 store.id at [0],store.Name [1] 等等上
  • 您可以更改您的选择并使用您需要的每一列,我编辑我的答案再试一次。
  • 我在数据库中也有一个 DB 视图,它也在从视图中获取列。如何排除视图?我有一个名为 GetMetaData 的视图。此外,还会获取其他列,例如 sysdiagrams.definition,sysdiagrams.diagram_id,sysdiagrams.name,sysdiagrams.principal_id,sysdiagrams.version
  • 这次没有获取视图,但我仍然得到这些列sysdiagrams.definition sysdiagrams.diagram_id sysdiagrams.name sysdiagrams.principal_id sysdiagrams.version
  • 是的,我只需要驻留在数据库中的表的列名。不需要视图和 sysdiagrams 表。就像我的数据库中有商店、地址和国家/地区表一样。所以应该只提取那些列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多