Я понимаю этот метод получения данных БД (используя 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
для перехода к строке, а затем использовать индексирование для ElementAt
к столбцу этой строки:
var data = rows.ElementAt(0)[0];
Вы даже можете ссылаться на столбцы по имени, поскольку на самом деле вы получаете IEnumerable<dynamic>
:
var row = rows.ElementAt(0);
//now you can access:
//row.columnName
//row.columnName2
IEnumerable
и другие?
List
против IEnumerable
. Кроме этого, я бы просто прочитал о коллекциях и, возможно, Linq
если вам интересно. Удачи!
Использование 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"]);
Теперь вы можете использовать имена столбцов
И, как упоминают пелотии,
IEnumerable<dynamic> results = db.Query("SELECT * FROM Table");
Console.WriteLine(results.ElementAt(0).Id);
.ToList()
.ToDictionary()
и .ToLookup()
Если вам нужен конкретный ответ для примера 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);
Что возвращает 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/…
Если вы используете 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>'