2011-10-05 72 views
9

我正在使用LINQPad,我想知道表的模式细节。LINQ:获取表详细信息

我知道,我使用SQL它:

SELECT column_name,* 
FROM information_schema.columns 
WHERE table_name = '{table_name}' 
ORDER BY ordinal_position 

我怎样才能做到这一点使用LINQ?

+0

我知道linq垫做它。也许你可以反思linq可执行文件? Resharper有免费的“dotPeek”。 – Crisfole

+0

@Cpfohl:我如何做反思? –

+0

我认为下面的答案绰绰有余。要真正看看源代码,你必须从Reflector的网站下载dotPeek并在exe上运行它。 – Crisfole

回答

6

LINQ to SQL上下文有一个Mapping属性,您可以使用这种事情。查询像您,可能是这个样子的一个:

from t in context.Mapping.GetTables() 
where t.TableName == "[table_name]" 
from c in t.RowType.DataMembers 
orderby c.Ordinal 
select new {columnName = c.Name, columnInfo = c} 

详情请参阅this answer

+0

我得到'IEnumerable <>(0项)' –

+0

@inquisitive_one:我猜这是由于你的表名。它必须用方括号括起来,就像你在给定的例子中看到的那样。所以名为'person_sites'的表格需要说''[person_sites]“'。 – StriplingWarrior

+0

我仍然得到相同的结果。我在LINQPad中将其作为“C#表达式”来完成。 –

4
MetaTable t = MyDataContext.Mapping.GetTables().Where(
    i => i.TableName == "TABLENAME").SingleOrDefault(); 
PropertyInfo[] fields = t.RowType.InheritanceRoot.GetType().GetProperties(); 

“域”将包含列的名称和类型。

+0

我得到'无法找到名称空间名称的类型“MetaTable”。 –

+0

[System.Data.Linq](http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.metatable.aspx) –

+0

我仍然收到相同的消息。我将“System.Data.Linq.dll”添加到查询的其他引用。我在LINQPad中使用“C#声明”。 –

0

在LINQ to SQL中,您可以尝试将这些视图引入模型中。如果这不起作用,您可以创建一个存储过程来检索信息,然后LINQ to SQL将映射存储过程并将其作为函数执行。