从数据库对象中获取数据而不使用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

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

您可以使用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对象,所以你可能需要第二种方式。

谢谢