从数据库对象获取数据而不使用foreach

时间:2014-08-22 12:32:08

标签: c# asp.net razor webmatrix asp.net-webpages

我理解这种获取数据库数据的方法(使用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

5 个答案:

答案 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个结果就可以了,你想要使用一个循环来消除。