从数据库对象中获取数据而不使用foreach
本文关键字:foreach 数据 数据库 对象 获取 | 更新日期: 2023-09-27 18:19:09
我理解这种获取DB数据的方法(使用foreach
):
var db = Database.Open("Connection");
var rows = db.Query("SELECT 1 columnName,2 columnName2 FROM Table");
foreach(var row in rows){
var data = row.columnName;
//or
var data = row[0];
}
这是有效的,但是我如何在不使用foreach的情况下获得数据?
var data = rows[0][1];
^这行不通。
基本上,我想弄清楚如何在不使用foreach的情况下获得数据。我该怎么做?
编辑:
.Query()
返回:
类型:System.Collections.Generic.IEnumerable
SQL查询返回的行。
如下所示:http://msdn.microsoft.com/en-us/library/webmatrix.data.database.query%28v=vs.111%29.aspx您可以使用ElementAt
方法获取该行,然后使用索引获取该行的列:
var data = rows.ElementAt(0)[0];
您甚至可以按名称引用列,因为您实际上正在接收IEnumerable<dynamic>
:
var row = rows.ElementAt(0);
//now you can access:
//row.columnName
//row.columnName2
在集合上使用ToArray()是一个选项;
var results = db.Query("SELECT * FROM Table").ToArray();
Console.WriteLine(results[1][2]);
这将允许您以您想要的方式引用结果集。但是,如果不以某种方式在查询中绑定集合,则最终可能会将一个大集合加载到内存中以这种方式引用它。我以前从未见过WebMatrix数据库,所以我不能给出任何技巧,以最有效的方式做到这一点,但是ToArray()会给你你想要的。
db。查询实际上返回DynamicRecord类型,因此如果您希望按名称引用列名,可以执行;
var results = db.Query("SELECT * FROM Table").Cast<DynamicRecord>().ToArray();
Console.WriteLine(results[0]["Id"]);
现在可以使用列名
正如petelids提到的,
IEnumerable<dynamic> results = db.Query("SELECT * FROM Table");
Console.WriteLine(results.ElementAt(0).Id);
如果您想要WebMatrix的具体答案。数据示例,那么这对您毫无帮助。
然而,如果你喜欢编写实际的SQL语句,但不喜欢繁琐的映射代码,那么我喜欢使用微orm,如OrmLite, PetaPoco, Massive, Dapper等…
这是一个使用我最喜欢的例子:http://www.toptensoftware.com/petapoco/
http://www.nuget.org/packages/petapoco/// <summary>
/// Create a Poco mapping class where the class name matches the Table name
/// and the properties match the column names and data types from the table
/// </summary>
public class Table{
public int ColumnName {get;set;}
public int ColumnName2 {get;set;}
}
int id = 1;
var db = new Database("Connection Name");
const string sql = @"SELECT
1 columnName,
2 columnName2
FROM Table
WHERE ColumnName = @0";
return db.FirstOrDefault<Table>(sql, id);
or
// Using auto-generated Select statement
return db.FirstOrDefault<Table>("WHERE ColumnName = @0", id);
// Fetch all records...
return db.Fetch<Table>("");
// PetaPoco also supports dynamic
return db.FirstOrDefault<dynamic>(sql, id);
查询返回一些我们需要的信息。您可以尝试将结果填充到数据表中。
然后像这样得到它:
DataTable dt = db.Query("SELECT 1 columnName,2 columnName2 FROM Table");
string s= dt.Rows[0][1].ToString();
但老实说,只要你能得到0个或多于1个结果,你就想使用循环来执行。
如果您正在使用数据表,请使用:
datatable.rows[0][1].toString()
或者使用IEnumerable对象时使用
objectName[0].propertyName.toString()
这里propertyName是你为datacoluml使用的属性的名称。
从http://msdn.microsoft.com/en-us/library/webmatrix.data.database.query%28v=vs.111%29.aspx我看到查询方法返回IEnumerable对象,所以你可能需要第二种方式。
谢谢