我理解这种获取数据库数据的方法(使用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
答案 0 :(得分:4)
您可以使用ElementAt
方法访问该行,然后使用索引转到该行的列:
var data = rows.ElementAt(0)[0];
您甚至可以在实际收到IEnumerable<dynamic>
时按名称引用列:
var row = rows.ElementAt(0);
//now you can access:
//row.columnName
//row.columnName2
答案 1 :(得分:2)
在您的收藏中使用ToArray()是一个选项;
var results = db.Query("SELECT * FROM Table").ToArray();
Console.WriteLine(results[1][2]);
这样您就可以按照自己的方式引用结果集。但是,如果您没有以某种方式在查询中绑定集合,则最终可能会将大型集合加载到内存中以便以这种方式引用它。我之前从未见过WebMatrix数据库,所以我不能以最有效的方式提供任何有关这方面的提示,但ToArray()会给你你想要的东西。
db.Query实际上返回了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);
答案 2 :(得分:1)
如果您想要WebMatrix.Data示例的特定答案,那么这根本不会为您提供帮助。
但是,如果您喜欢编写实际的SQL语句,但不喜欢繁琐的映射代码,那么我喜欢使用OrmLite,PetaPoco,Massive,Dapper等微ORM ......
这是一个使用我最喜欢的例子: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);
答案 3 :(得分:0)
如果您使用DataTable,请使用:
datatable.rows[0][1].toString()
或者如果您正在使用IEnumerable对象
objectName[0].propertyName.toString()
此处propertyName是您为该DataColumn使用的属性的名称。
从http://msdn.microsoft.com/en-us/library/webmatrix.data.database.query%28v=vs.111%29.aspx我看到查询方法返回IEnumerable对象,所以你可能需要第二种方式。
谢谢
答案 4 :(得分:0)
db.Query返回的是我们需要的一些信息。 您可以尝试将结果填入数据表中。
然后像这样回来:
DataTable dt = db.Query("SELECT 1 columnName,2 columnName2 FROM Table");
string s= dt.Rows[0][1].ToString();
但说实话,只要你能得到0或者更多然后1个结果就可以了,你想要使用一个循环来消除。