【问题标题】:Getting data from Database object without using foreach不使用 foreach 从数据库对象获取数据
【发布时间】:2014-10-16 07:33:52
【问题描述】:

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

【问题讨论】:

  • 查询返回什么?
  • 仍然没有回答问题.. db.Query 是实体框架还是其他东西?
  • db.Query 返回什么类型? IQueryable、IEnumerable、MySpecialDataSetCollection
  • 您通过显示更通用的代码并没有帮助回答问题。您使用的是实体框架之类的库吗?这是一些本土的 ORM 吗?
  • 相信IEnumerable,可以看这里msdn.microsoft.com/en-us/library/…

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


【解决方案1】:

如果您使用的是 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 对象,因此您可能需要第二种方法。

谢谢

【讨论】:

  • 试过 var data = rows[0].columnName.toString() 并得到这个错误:Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.IEnumerable<dynamic>'
  • 请注意,我在第二种情况下写的是 propertyName,而不是 columnName。你只是不能在这里写数据库列名。您必须将该表的列映射到一个类。详情请看这里:mikesdotnetting.com/Article/172/…
【解决方案2】:

db.Query 返回的是我们需要的一些信息。 您可以尝试将结果填充到数据表中。

然后像这样取回它:

DataTable dt = db.Query("SELECT 1 columnName,2 columnName2 FROM Table");
string s=  dt.Rows[0][1].ToString();

但老实说,只要你能得到 0 个或更多然后 1 个结果,你就想使用循环来解决问题。

【讨论】:

  • 我编辑了我的答案以显示 .Query() 方法返回的内容,它也显示在此处:msdn.microsoft.com/en-us/library/…
  • @Frysning,数据库来自 WebMatrix.Data,返回 IEnumerable,而不是 DataTable。在下面,它看起来像是 DynamicRecord 类型
  • 对不起,我不知道。嗯,我也学到了一些东西。
【解决方案3】:

在您的集合上使用 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);

【讨论】:

  • 这似乎有效,另外我想添加它也可以使用.ToList().ToDictionary().ToLookup()
【解决方案4】:

您可以使用ElementAt 方法获取行,然后使用索引获取该行的列:

var data = rows.ElementAt(0)[0];

您甚至可以在实际收到IEnumerable&lt;dynamic&gt; 时按名称引用列:

var row = rows.ElementAt(0);
//now you can access:
//row.columnName
//row.columnName2

【讨论】:

  • 效果很好,谢谢。有什么好的资源可以了解所有这些新的精彩类型,如 IEnumerable 和其他类型?
  • 不客气@ZeeTee。至于阅读this questionListIEnumerable 有很好的描述。除此之外,我只是阅读收藏品,如果您有兴趣,也许是Linq。祝你好运!
【解决方案5】:

如果您想要 WebMatrix.Data 示例的具体答案,那么这对您毫无帮助。

但是,如果您喜欢编写实际的 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);

【讨论】:

猜你喜欢
  • 2011-10-19
  • 2015-07-10
  • 2012-06-13
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 2020-01-22
  • 2014-12-03
  • 2018-07-27
相关资源
最近更新 更多