我有这个linq查询:
string title = from DataRow r in (OleDB.DataItems.Tables[0]).Rows
select r.Title;
我想在行上提取字段标题(来自数据库)(行将是1,而不是更多,所以我放在一个字符串而不是字符串[]。
我该怎么办?
VStudio说DataRow不包含Title的定义,但字段Title存在于数据库中。
我制造混乱:)
答案 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;
希望这有帮助。