如何在datarow上选择带linq的字段

时间:2011-07-01 10:12:30

标签: c# linq datarow

我有这个linq查询:

string title = from DataRow r in (OleDB.DataItems.Tables[0]).Rows
select r.Title;

我想在行上提取字段标题(来自数据库)(行将是1,而不是更多,所以我放在一个字符串而不是字符串[]。

我该怎么办?

VStudio说DataRow不包含Title的定义,但字段Title存在于数据库中。

我制造混乱:)

5 个答案:

答案 0 :(得分:5)

FrédéricHamidi说,你不需要LINQ。

但是,如果您仍然希望以这种方式(过度杀戮)并且您知道总是有一个单行的表,请执行:

DataSet data = new DataSet();

var table = (from a in data.Tables.Cast<DataTable>() select a).Single();

var row = (from a in table.Rows.Cast<DataRow>() select a).Single();

String title = row.Field<String>("Title");

DataSet data = new DataSet();

var table = (from a in data.Tables.Cast<DataTable>() select a).SingleOrDefault();

var row = (from a in table.Rows.Cast<DataRow>() select a).SingleOrDefault();

String title = row.Field<String>("Title");

我使用了DataSet,因为我不知道你的对象是如何构建的。

答案 1 :(得分:4)

您不需要LINQ,因为您只想获取集合中第一行的Title字段:

string title = OleDB.DataItems.Tables[0].Rows[0]["Title"];

答案 2 :(得分:1)

string title = (from DataRow r in (OleDB.DataItems.Tables[0]).Rows
    select r.Title).First();

Linq返回一个可枚举的集合,因为它不知道只有一个项目。调用First方法将返回查询中的第一个项目。

编辑:坚持下去,我公然错过了您最初提到的问题(但您仍然需要上述内容)!

数据行包含字段,而不包含属性。你需要做的是

select r.Field<string>("Title")

所以你的整个查询将是

string title = (from DataRow r in (OleDB.DataItems.Tables[0]).Rows
    select r.Field<string>("Title")).First();

答案 3 :(得分:1)

最好使用FirstOrDefault,以防没有行:

string title = (from DataRow r in (OleDB.DataItems.Tables[0]).Rows
    select r.Title).FirstOrDefault();

答案 4 :(得分:1)

通常,如果需要执行此类操作,则可以将DataRow对象强制转换为与数据库中的表对应的强类型对象。

我假设有一个“Book”类,其中包含“Title”字段:

Book selectedBook = (Book) from DataRow r in (OleDB.DataItems.Tables[0]).Rows[0]
string sTitle = selectedBook.Title;

希望这有帮助。