我正在尝试运行 linq 查询,但我需要结果作为数据表,因为我使用它来将来自不同查询的记录存储在同一视图状态对象中。
下面的 2 个版本可以编译,但返回一个空集。确切的错误是“值不能为空。
参数名称:来源”。 (是的,我已经检查过有数据):
MyDatabaseDataContext db = new MyDatabaseDataContext(conn);
IEnumerable<DataRow> queryProjects =
(from DataRow p in db.STREAM_PROJECTs.AsEnumerable()
where p.Field<int>("STREAM_ID") == StreamID
select new
{
PROJECT_ID = p.Field<int>("PROJECT_ID"),
PROJECT_NAME = p.Field<string>("PROJECT_NAME")
}) as IEnumerable<DataRow>;
DataTable results = queryProjects.CopyToDataTable<DataRow>();
...
//(from p in db.STREAM_PROJECTs.AsEnumerable()
//where p.STREAM_ID == StreamID
//select new
//{
// p.PROJECT_NAME,
// p.PROJECT_ID
//}) as IEnumerable<DataRow>;
本节中的例子thread在这种情况下似乎也不起作用。
我想我可以用老式的方式运行 sql 查询命令,但是 linq 不是应该更快吗?
你的问题是这样的:
as IEnumerable<DataRow>
The as
关键字执行安全转换,而不是转换,您可能认为它正在执行转换。这as
关键字在语义上与执行此操作相同:
IEnumerable<DataRow> queryProjects =
(IEnumerable<DataRow>)(from DataRow p in db.STREAM_PROJECTs.AsEnumerable()
where p.Field<int>("STREAM_ID") == StreamID
select new
{
PROJECT_ID = p.Field<int>("PROJECT_ID"),
PROJECT_NAME = p.Field<int>("PROJECT_NAME")
});
除了带有的版本as
当它无法转换你的查询对象(这是一个IQueryable<T>
, where T
是匿名类型)到IEnumerable<DataRow>
(事实并非如此)。
不幸的是,据我所知,没有内置方法可以获取具体类型的可枚举类型(例如本示例中的匿名类型)并将其转换为DataTable
。编写一个不会太复杂,因为您本质上需要反射性地获取属性,然后迭代集合并使用这些属性在DataTable
。我将在几个例子中发布一个例子。
像这样的东西,放置在您所在的命名空间内的静态类中using
,应该提供一个扩展方法来执行您想要的操作:
public static DataTable ToDataTable<T>(this IEnumerable<T> source)
{
PropertyInfo[] properties = typeof(T).GetProperties();
DataTable output = new DataTable();
foreach(var prop in properties)
{
output.Columns.Add(prop.Name, prop.PropertyType);
}
foreach(var item in source)
{
DataRow row = output.NewRow();
foreach(var prop in properties)
{
row[prop.Name] = prop.GetValue(item, null);
}
output.Rows.Add(row);
}
return output;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)