Когда вы создаете массив, вы не получаете экземпляр NSArray
. Обычно вы получаете NSCFArray
, хотя есть и другие частные классы, такие как __NSArrayM
и т. Д.
Вы не можете запросить против DataTable
строки набор, так как DataRowCollection
не реализует IEnumerable<T>
. Необходимо использовать AsEnumerable()
расширение для DataTable
. Как так:
var results = from myRow in myDataTable.AsEnumerable()
where myRow.Field<int>("RowNo") == 1
select myRow;
И поскольку Keith говорит, необходимо будет добавить ссылку на [1 112] Система. Данные. Возвраты DataSetExtensions
AsEnumerable()
IEnumerable<DataRow>
. Если необходимо преобразовать IEnumerable<DataRow>
в DataTable
, используйте CopyToDataTable()
расширение.
Ниже запрос с Лямбда-выражением,
var result = myDataTable
.AsEnumerable()
.Where(myRow => myRow.Field<int>("RowNo") == 1);
Можно использовать LINQ для объектов на наборе строк, как так:
var results = from myRow in myDataTable.Rows where myRow.Field("RowNo") == 1 select myRow;
Не то, чтобы им сознательно не позволили на DataTables, это просто, что DataTables предшествуют IQueryable и универсальным конструкциям IEnumerable, на которых могут быть выполнены запросы Linq.
Оба интерфейса требуют некоторой проверки безопасности типов вида. DataTables не со строгим контролем типов. Это - та же причина, почему люди не могут запросить против ArrayList, например.
Для Linq для работы необходимо отобразить результаты против безопасных с точки зрения типов объектов и запрос против этого вместо этого.
Поскольку @ch00k сказал:
using System.Data; //needed for the extension methods to work
...
var results =
from myRow in myDataTable.Rows
where myRow.Field<int>("RowNo") == 1
select myRow; //select the thing you want, not the collection
также необходимо добавить ссылку проекта к System.Data.DataSetExtensions
var results = from DataRow myRow in myDataTable.Rows
where (int)myRow["RowNo"] == 1
select myRow
var query = from p in dt.AsEnumerable()
where p.Field<string>("code") == this.txtCat.Text
select new
{
name = p.Field<string>("name"),
age= p.Field<int>("age")
};
поля имени и возраста теперь являются частью объекта запроса и доступны следующим образом: Console.WriteLine (query.name);