如何使用c#从sql封装这些数据?

时间:2011-11-03 13:26:22

标签: c# sql sql-server

我有脚本:

select
    fk.name,
    object_name(fk.parent_object_id) 'Parent table',
    c1.name 'Parent column',
    object_name(fk.referenced_object_id) 'Referenced table',
    c2.name 'Referenced column'
from 
    sys.foreign_keys fk
inner join
    sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
inner join
    sys.columns c1 ON fkc.parent_column_id = c1.column_id and c1.object_id = fkc.parent_object_id
inner join
    sys.columns c2 ON fkc.referenced_column_id = c2.column_id and c2.object_id = fkc.referenced_object_id

而且我知道我得到的结果有5列。是否有一种灵活而有效的方法将此数据存储在linq类型对象或iQueryable对象中?我希望能够遍历它...

4 个答案:

答案 0 :(得分:1)

有一些ORMs使用了IQueryable:Entity FrameworkLINQ to SQLNHibernateSubsonic等。我建议尝试一下。

答案 1 :(得分:1)

对于very lightweight ORM,您可以使用DataContext的ExecuteQuery

class YourRow
{
    public string Col1 { get; set; }
    public string Col2 { get; set; }
    ...
}

// DataContext takes a connection string as parameter
var db = new DataContext("Data Source=myServerAddress;" +
    "Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;");
var rows = db.ExecuteQuery<YourRow>(@"
    select  fk.name,
            object_name(fk.parent_object_id) 'Parent table',
            ...
    ");

如果可以在视图中存储SQL查询,可以将视图拖到DBML文件中,让LINQ为您创建包装类。

答案 2 :(得分:0)

如果使用DbCommand和DataReader执行此脚本,则可以迭代返回的行,并将它们添加到将保存5列的自定义对象列表中。

然后,您可以使用Linq To Objects过滤列表。

或者您可以使用ORM将实体映射到数据库。如果为查询创建数据库视图,则可以使用例如实体框架将实体映射到视图,并使用它来执行进一步的查询。

答案 3 :(得分:0)

您可以将其存储到DataTable中。您已在项目中添加程序集System.Data.Extensions以将DataTable用作IQueryable。

from tbl in dataTable.AsEnumerable()
//where clause
select tbl;

DataView view = tbl.AsDataView();