Как выбрать поле с linq на datarow - PullRequest
0 голосов
/ 01 июля 2011

У меня есть этот запрос linq:

string title = from DataRow r in (OleDB.DataItems.Tables[0]).Rows
select r.Title;

, и я хотел бы извлечь поле Заголовок (из базы данных) в строке (строк будет 1, не больше, так что я положил настрока, а не строка [].

Как я могу это сделать?

VStudio говорит, что DataRow не содержит определения Title, но поле Title существует в базе данных.

Я смущаюсь:)

Ответы [ 5 ]

5 голосов
/ 01 июля 2011

Как сказал Фредерик Хамиди, LINQ вам не нужен.

Однако, если вы все еще хотите сделать это таким образом (излишне) и знаете, что всегда есть одна таблица с одной строкой, выполните:

DataSet data = new DataSet();

var table = (from a in data.Tables.Cast<DataTable>() select a).Single();

var row = (from a in table.Rows.Cast<DataRow>() select a).Single();

String title = row.Field<String>("Title");

или

DataSet data = new DataSet();

var table = (from a in data.Tables.Cast<DataTable>() select a).SingleOrDefault();

var row = (from a in table.Rows.Cast<DataRow>() select a).SingleOrDefault();

String title = row.Field<String>("Title");

Я использовал DataSet, потому что я не знаю, как устроен ваш объект.

4 голосов
/ 01 июля 2011

Вам не нужен LINQ, поскольку вы хотите получить только поле Title первой строки в коллекции:

string title = OleDB.DataItems.Tables[0].Rows[0]["Title"];
1 голос
/ 01 июля 2011

Обычно, если вам нужно выполнить такое действие, вы приведете объект DataRow к вашему строго типизированному объекту, соответствующему таблице в вашей базе данных.

Я предполагаю, что существует класс "Book", который содержитполе "Заголовок":

Book selectedBook = (Book) from DataRow r in (OleDB.DataItems.Tables[0]).Rows[0]
string sTitle = selectedBook.Title;

Надеюсь, это поможет.

1 голос
/ 01 июля 2011

Лучше использовать FirstOrDefault, если строк нет:

string title = (from DataRow r in (OleDB.DataItems.Tables[0]).Rows
    select r.Title).FirstOrDefault();
1 голос
/ 01 июля 2011

1001 * попробовать *

string title = (from DataRow r in (OleDB.DataItems.Tables[0]).Rows
    select r.Title).First();

Linq возвращает перечисляемую коллекцию, так как не знает, что будет только один элемент. Вызов метода First вернет первый элемент из запроса.

Редактировать: Погоди, я явно упустил проблему, о которой ты упомянул изначально (но тебе все равно понадобится выше)!

Строка данных содержит поля, а не свойства как таковые. Что вам нужно сделать, это

select r.Field<string>("Title")

Таким образом, весь ваш запрос будет

string title = (from DataRow r in (OleDB.DataItems.Tables[0]).Rows
    select r.Field<string>("Title")).First();
...