Получение данных из объекта базы данных без использования foreach

1

Я понимаю этот метод получения данных БД (используя 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

  • 1
    Что возвращает Query?
  • 0
    Пожалуйста, смотрите редактировать
Показать ещё 6 комментариев
Теги:
razor
asp.net-webpages
webmatrix

5 ответов

4
Лучший ответ

Вы можете использовать метод ElementAt для перехода к строке, а затем использовать индексирование для ElementAt к столбцу этой строки:

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

Вы даже можете ссылаться на столбцы по имени, поскольку на самом деле вы получаете IEnumerable<dynamic>:

var row = rows.ElementAt(0);
//now you can access:
//row.columnName
//row.columnName2
  • 0
    Отлично работает, спасибо. Какой хороший ресурс, чтобы узнать обо всех этих новых замечательных типах, таких как IEnumerable и другие?
  • 0
    Добро пожаловать @ZeeTee. Что касается чтения этого вопроса, есть хорошее описание в List против IEnumerable . Кроме этого, я бы просто прочитал о коллекциях и, возможно, Linq если вам интересно. Удачи!
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"]);

Теперь вы можете использовать имена столбцов

И, как упоминают пелотии,

IEnumerable<dynamic> results = db.Query("SELECT * FROM Table");

Console.WriteLine(results.ElementAt(0).Id);
  • 0
    Кажется, это работает, кроме того, я хотел бы добавить, что он также может использовать .ToList() .ToDictionary() и .ToLookup()
1

Если вам нужен конкретный ответ для примера 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);
  • 0
    Это хорошая дополнительная информация (я обычно использую Dapper в своих домашних проектах). Было бы удобно добавлять ссылки, если они у вас есть! +1
  • 0
    Dapper -> github.com/StackExchange/dapper-dot-net , Massive -> github.com/robconery/massive , ORM Lite -> github.com/ServiceStack/ServiceStack.OrmLite
Показать ещё 1 комментарий
0

Что возвращает db.Query - это некоторая информация, которая нам нужна. То, что вы можете попробовать, это заполнить ваш результат в виде данных.

И затем возвращаясь вот так:

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

Но, если честно, если вы можете получить 0 или более, то 1 результат назад вы хотите использовать цикл, чтобы разгневаться.

  • 0
    Я отредактировал свой ответ, чтобы показать, что возвращает метод .Query() , он также показан здесь: msdn.microsoft.com/en-us/library/…
  • 0
    @Frysning, база данных поступает из WebMatrix.Data, возвращает IEnumerable, а не DataTable. Внизу это выглядит как будто это DynamicRecord
Показать ещё 1 комментарий
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, поэтому вам может понадобиться второй способ.

спасибо

  • 0
    Попробовал var data = rows[0].columnName.toString() и получил эту ошибку: Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.IEnumerable<dynamic>'
  • 0
    Обратите внимание, что я пишу propertyName, а не columnName во втором случае. Вы просто не можете написать имя столбца базы данных здесь. Вы должны сопоставить столбцы этой таблицы с классом. Подробности можно посмотреть здесь: mikesdotnetting.com/Article/172/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню