LINQ dotazu na DataTable

hlasů
865

Snažím se provádět LINQ dotaz na objekt DataTable a bizarně jsem k závěru, že provádění takové dotazy na DataTables není jednoduché. Například:

var results = from myRow in myDataTable
where results.Field(RowNo) == 1
select results;

To není povoleno. Jak získám něco takového fungovat?

Udivuje mě, že LINQ dotazy nejsou povoleny DataTables!

Položena 14/08/2008 v 11:08
zdroj uživatelem
V jiných jazycích...                            


23 odpovědí

hlasů
1k

Nemůžete dotaz proti DataTable‚s řádky sběru, protože DataRowCollectionneimplementuje IEnumerable<T>. Musíte použít AsEnumerable()rozšíření pro DataTable. Jako tak:

var results = from myRow in myDataTable.AsEnumerable()
where myRow.Field<int>("RowNo") == 1
select myRow;

A jak říká Keith, budete muset přidat odkaz na System.Data.DataSetExtensions

AsEnumerable()vrací IEnumerable<DataRow>. Pokud potřebujete převést IEnumerable<DataRow>do A DataTable, použijte CopyToDataTable()rozšíření.

Odpovězeno 14/08/2008 v 20:45
zdroj uživatelem

hlasů
106
var results = from DataRow myRow in myDataTable.Rows
    where (int)myRow["RowNo"] == 1
    select myRow
Odpovězeno 05/03/2009 v 03:53
zdroj uživatelem

hlasů
51

Není to tak, že se úmyslně není dovoleno DataTables, je to jen, že DataTables antedatovat IQueryable a generické IEnumerable konstrukty, na nichž lze provádět LINQ dotazy.

Obě rozhraní vyžadují nějaký druh typu bezpečnostní ověření. DataTables nejsou silně zadali. Jedná se o stejný důvod, proč lidé nemohou dotazovat na ArrayList, například.

Pro LINQ pro práci je třeba zmapovat své výsledky proti typově bezpečné objektů a dotazu, proti které místo.

Odpovězeno 14/08/2008 v 11:10
zdroj uživatelem

hlasů
43

Jak @ ch00k, že:

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

Také je potřeba přidat do projektu odkaz na System.Data.DataSetExtensions

Odpovězeno 14/08/2008 v 12:07
zdroj uživatelem

hlasů
30
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")                         
                    };
Odpovězeno 23/05/2010 v 05:03
zdroj uživatelem

hlasů
23
//Create DataTable 
DataTable dt= new DataTable();
dt.Columns.AddRange(New DataColumn[]
{
   new DataColumn("ID",typeOf(System.Int32)),
   new DataColumn("Name",typeOf(System.String))

});

//Fill with data

dt.Rows.Add(new Object[]{1,"Test1"});
dt.Rows.Add(new Object[]{2,"Test2"});

//Now  Query DataTable with linq
//To work with linq it should required our source implement IEnumerable interface.
//But DataTable not Implement IEnumerable interface
//So we call DataTable Extension method  i.e AsEnumerable() this will return EnumerableRowCollection<DataRow>


// Now Query DataTable to find Row whoes ID=1

DataRow drow = dt.AsEnumerable().Where(p=>p.Field<Int32>(0)==1).FirstOrDefault();
 // 
Odpovězeno 05/01/2012 v 09:43
zdroj uživatelem

hlasů
23

Pomocí LINQ k manipulaci s daty v datové sady / DataTable

var results = from myRow in tblCurrentStock.AsEnumerable()
              where myRow.Field<string>("item_name").ToUpper().StartsWith(tbSearchItem.Text.ToUpper())
              select myRow;
DataView view = results.AsDataView();
Odpovězeno 13/07/2011 v 12:21
zdroj uživatelem

hlasů
18

Uvědomuji si, to byla zodpovězena několikrát více, ale jen proto, aby nabídl jiný přístup, který bych použít .Cast<T>()metodu, to mi pomáhá udržovat zdravý rozum na tom explicitní typ definován, a v hloubi duše jsem si, že .AsEnumerable()volá to tak jako tak:

var results = from myRow in myDataTable.Rows.Cast<DataRow>()
                  where myRow.Field<int>("RowNo") == 1 select myRow;

nebo

var results = myDataTable.Rows.Cast<DataRow>()
                  .FirstOrDefault(x => x.Field<int>("RowNo") == 1);
Odpovězeno 02/02/2016 v 21:22
zdroj uživatelem

hlasů
14

Můžete použít LINQ na objekty v kolekci řádků, které vypadají takto:

var results = from myRow in myDataTable.Rows where myRow.Field("RowNo") == 1 select myRow;
Odpovězeno 14/08/2008 v 11:11
zdroj uživatelem

hlasů
13

Zkuste tento jednoduchý řádek dotazu:

var result=myDataTable.AsEnumerable().Where(myRow => myRow.Field<int>("RowNo") == 1);
Odpovězeno 05/04/2016 v 09:38
zdroj uživatelem

hlasů
9

Zkuste to

var row = (from result in dt.AsEnumerable().OrderBy( result => Guid.NewGuid()) select result).Take(3) ; 
Odpovězeno 18/05/2012 v 08:15
zdroj uživatelem

hlasů
8

S největší pravděpodobností, třídy pro DataSet, DataTable a DataRow jsou již definovány v roztoku. Pokud tomu tak je tomu nebudete potřebovat odkaz DataSetExtensions.

Ex. DataSet class Název-> CustomSet, DataRow třída Název-> CustomTableRow (s definovanými sloupy: RowNo, ...)

var result = from myRow in myDataTable.Rows.OfType<CustomSet.CustomTableRow>()
             where myRow.RowNo == 1
             select myRow;

Nebo (jak jsem přednost)

var result = myDataTable.Rows.OfType<CustomSet.CustomTableRow>().Where(myRow => myRow.RowNo);
Odpovězeno 24/04/2013 v 18:17
zdroj uživatelem

hlasů
7

Jedná se o jednoduchý způsob, který pracuje pro mne a používá výrazy lambda:

var results = myDataTable.Select("").FirstOrDefault(x => (int)x["RowNo"] == 1)

Pak, pokud chcete určitou hodnotu:

if(results != null) 
    var foo = results["ColName"].ToString()
Odpovězeno 18/03/2015 v 22:13
zdroj uživatelem

hlasů
6
var results = from myRow in myDataTable
where results.Field<Int32>("RowNo") == 1
select results;
Odpovězeno 01/02/2014 v 12:51
zdroj uživatelem

hlasů
3

Příklad toho, jak toho dosáhnout, je stanoveno níže:

DataSet dataSet = new DataSet(); //Create a dataset
dataSet = _DataEntryDataLayer.ReadResults(); //Call to the dataLayer to return the data

//LINQ query on a DataTable
var dataList = dataSet.Tables["DataTable"]
              .AsEnumerable()
              .Select(i => new
              {
                 ID = i["ID"],
                 Name = i["Name"]
               }).ToList();
Odpovězeno 25/10/2017 v 16:04
zdroj uživatelem

hlasů
3
IEnumerable<string> result = from myRow in dataTableResult.AsEnumerable()
                             select myRow["server"].ToString() ;
Odpovězeno 04/08/2015 v 07:32
zdroj uživatelem

hlasů
3

V mé žádosti jsem zjistil, že pomocí LINQ pro datové sady s příponou AsEnumerable () pro DataTable, jak je navrženo v odpovědi byl extrémně pomalý. Máte-li zájem o optimalizaci pro rychlost, použijte knihovnu Json.Net Jamese Newtonking je ( http://james.newtonking.com/json/help/index.html )

// Serialize the DataTable to a json string
string serializedTable = JsonConvert.SerializeObject(myDataTable);    
Jarray dataRows = Jarray.Parse(serializedTable);

// Run the LINQ query
List<JToken> results = (from row in dataRows
                    where (int) row["ans_key"] == 42
                    select row).ToList();

// If you need the results to be in a DataTable
string jsonResults = JsonConvert.SerializeObject(results);
DataTable resultsTable = JsonConvert.DeserializeObject<DataTable>(jsonResults);
Odpovězeno 14/10/2014 v 18:51
zdroj uživatelem

hlasů
3

Pro VB.NET Kód bude vypadat takto:

Dim results = From myRow In myDataTable  
Where myRow.Field(Of Int32)("RowNo") = 1 Select myRow
Odpovězeno 17/10/2012 v 17:04
zdroj uživatelem

hlasů
2

Můžete si to fungovalo elegantní pomocí LINQ, jako je tento:

from prod in TenMostExpensiveProducts().Tables[0].AsEnumerable()
where prod.Field<decimal>("UnitPrice") > 62.500M
select prod

Nebo jako dynamické LINQ to (AsDynamic se nazývá přímo na DataSet):

TenMostExpensiveProducts().AsDynamic().Where (x => x.UnitPrice > 62.500M)

Raději posledního přístupu, přičemž je je nejvíce flexibilní. PS: Nezapomeňte připojit System.Data.DataSetExtensions.dllreferenční

Odpovězeno 03/11/2013 v 18:54
zdroj uživatelem

hlasů
1

Zkuste to...

SqlCommand cmd = new SqlCommand( "Select * from Employee",con);
SqlDataReader dr = cmd.ExecuteReader( );
DataTable dt = new DataTable( "Employee" );
dt.Load( dr );
var Data = dt.AsEnumerable( );
var names = from emp in Data select emp.Field<String>( dt.Columns[1] );
foreach( var name in names )
{
    Console.WriteLine( name );
}
Odpovězeno 10/04/2014 v 11:24
zdroj uživatelem

hlasů
0

Navrhuji následující řešení:

DataView view = new DataView(myDataTable); 
view.RowFilter = "RowNo = 1";
DataTable results = view.ToTable(true);

Při pohledu na DataView dokumentace , první věc, kterou můžeme vidět, je toto:

Představuje databindable, vlastní pohled na DataTable pro třídění, filtrování, vyhledávání, úpravy a navigaci.

To, co jsem se dostat z toho je, že DataTable je určen pouze pro ukládání dat a DataView je tam nám umožňují „dotaz“ proti DataTable.

Zde je, jak to funguje v tomto konkrétním případě:

Došlo k pokusu o provedení příkazu SQL

SELECT *
FROM myDataTable
WHERE RowNo = 1

v „DataTable jazyk“. V C # bychom ji čtou jako toto:

FROM myDataTable
WHERE RowNo = 1
SELECT *

která vypadá v jazyce C #, jako je tento:

DataView view = new DataView(myDataTable);  //FROM myDataTable
view.RowFilter = "RowNo = 1";  //WHERE RowNo = 1
DataTable results = view.ToTable(true);  //SELECT *
Odpovězeno 19/08/2019 v 17:18
zdroj uživatelem

hlasů
0
                ICommonExtService commonExtService = ProxyHelper.GetCommonExtServiceProxy();

                filledJSON = commonExtService.GetCandidateData(candidateCode.Trim());
                JObject CanidateDataObj = new JObject();
                if (string.IsNullOrEmpty(filledJSON) == false)
                {
                    DataTable dt = new DataTable();

                    dt = JsonConvert.DeserializeObject<DataTable>(filledJSON);

                    DataTable DtC = dt.Clone();

                    foreach (DataColumn column in DtC.Columns)
                    {
                        column.DataType = typeof(string);
                    }
                    foreach (DataRow row in dt.Rows)
                    {
                        DtC.ImportRow(row);
                    }

                    try
                    {
                        if (DtC != null && DtC.Columns.Count > 0 && DtC.Rows.Count > 0)
                        {
                            //Json Formating code
                            var filter = (from r1 in DtC.AsEnumerable()
                                          group r1 by new
                                          {
                                              CandidateCode = r1.Field<string>("CandidateCode"),
                                              FirstName = r1.Field<string>("FirstName"),
                                              MiddleName = r1.Field<string>("MiddleName"),

                                              LastName = r1.Field<string>("LastName"),
                                              FullName = r1.Field<string>("FullName"),

                                              DistributionCode = r1.Field<string>("DistributionCode"),
                                              GoCode = r1.Field<string>("GoCode"),
                                              SSN = r1.Field<string>("SSN")

                                          } into g
                                          select new
                                          {

                                              FirstName = g.Key.FirstName,
                                              MiddleName = g.Key.MiddleName,
                                              LastName = g.Key.LastName,
                                              FullName = g.Key.FullName,
                                              CandidateCode = g.Key.CandidateCode,
                                              DistributionCode = g.Key.DistributionCode,
                                              GoCode = g.Key.GoCode,
                                              SSN = g.Key.SSN,

                                              AddressList = from a1 in g.ToList().
                                                          Where(e1 => (e1.Field<string>("AddressLine1") == ""
                                                          && e1.Field<string>("State") == ""
                                                          && e1.Field<string>("City") == ""
                                                          && e1.Field<string>("ZipCode") == ""
                                                          && e1.Field<string>("County") == ""
                                                          && e1.Field<string>("Country") == "") == false
                                                          )
                                                            group a1 by new
                                                            {
                                                                AddressLine1 = a1.Field<string>("AddressLine1"),
                                                                State = a1.Field<string>("State"),
                                                                City = a1.Field<string>("City"),
                                                                ZipCode = a1.Field<string>("ZipCode"),
                                                                County = a1.Field<string>("County"),
                                                                Country = a1.Field<string>("Country")
                                                            } into f
                                                            select new
                                                            {
                                                                AddressLine1 = f.Key.AddressLine1,
                                                                State = f.Key.State,
                                                                City = f.Key.City,
                                                                ZipCode = f.Key.ZipCode,
                                                                County = f.Key.County,
                                                                Country = f.Key.Country
                                                            },

                                              EmploymentHistoryList = from e1 in g.ToList().
                                                          Where(e1 => (e1.Field<string>("EmployerName") == ""
                                                          && e1.Field<string>("JobTitle") == ""
                                                          && e1.Field<string>("City") == ""
                                                          && e1.Field<string>("State") == ""
                                                          && e1.Field<string>("County") == ""
                                                          && e1.Field<string>("ZipCode") == ""
                                                          && e1.Field<string>("ManagerFirstName") == ""
                                                          && e1.Field<string>("ManagerLastName") == "") == false
                                                          )
                                                                      group e1 by new
                                                                      {
                                                                          EmployerName = e1.Field<string>("EmployerName"),
                                                                          JobTitle = e1.Field<string>("JobTitle"),
                                                                          City = e1.Field<string>("City"),
                                                                          State = e1.Field<string>("State"),
                                                                          County = e1.Field<string>("County"),
                                                                          ZipCode = e1.Field<string>("ZipCode"),
                                                                          ManagerFirstName = e1.Field<string>("ManagerFirstName"),
                                                                          ManagerLastName = e1.Field<string>("ManagerLastName")
                                                                      } into h
                                                                      select new
                                                                      {
                                                                          EmployerName = h.Key.EmployerName,
                                                                          JobTitle = h.Key.JobTitle,
                                                                          City = h.Key.City,
                                                                          State = h.Key.State,
                                                                          County = h.Key.County,
                                                                          ZipCode = h.Key.ZipCode,
                                                                          ManagerFirstName = h.Key.ManagerFirstName,
                                                                          ManagerLastName = h.Key.ManagerLastName
                                                                      }

                                          });

                            if (filter != null)
                            {
                                JArray jr = JArray.FromObject(filter);
                                CanidateDataObj = (JObject)jr[0];
                            }
                            if (_responsemsg.Content == null && CanidateDataObj.HasValues == true)
                            {

                                ResponseData = new JObject();
                                ResponseData.Add("ResponseCode", ResponseCode.Success.ToString());
                                ResponseData.Add("ResponseMessage", "Data present");
                                ResponseData.Add("Data", CanidateDataObj);
                                _responsemsg.StatusCode = System.Net.HttpStatusCode.OK;
                                _responsemsg.Content = new ObjectContent<JObject>(ResponseData, formatter, "application/json");
                                return _responsemsg;
                            }
                        }
                        else
                        {
                            ResponseData = new JObject();
                            ResponseData.Add("responseCode", ResponseCode.Failure.ToString());
                            ResponseData.Add("responseMessage", "No candidate found with given Code");
                            _responsemsg.StatusCode = System.Net.HttpStatusCode.NotFound;
                            _responsemsg.Content = new ObjectContent<JObject>(ResponseData, formatter, "application/json");
                            return _responsemsg;
                        }
                    }
                    catch (Exception Ex)
                    {
                        ResponseData = new JObject();
                        ResponseData.Add("responseCode", ResponseCode.Failure.ToString());
                        ResponseData.Add("responseMessage", Ex.Message.ToString());
                        _responsemsg.StatusCode = System.Net.HttpStatusCode.InternalServerError;
                        _responsemsg.Content = new ObjectContent<JObject>(ResponseData, formatter, "application/json");
                        return _responsemsg;
                    }

                }
                else if(string.IsNullOrEmpty(candidateCode)==false)
                {
                    ResponseData = new JObject();
                    ResponseData.Add("responseCode", ResponseCode.Failure.ToString());
                    ResponseData.Add("responseMessage", "No candidate found with given Code");
                    _responsemsg.StatusCode = System.Net.HttpStatusCode.NotFound;
                    _responsemsg.Content = new ObjectContent<JObject>(ResponseData, formatter, "application/json");
                    return _responsemsg;

                }
                else
                {
                    ResponseData = new JObject();
                    ResponseData.Add("responseCode", ResponseCode.Failure.ToString());
                    ResponseData.Add("responseMessage", "Please provide valid candidate code");
                    _responsemsg.StatusCode = System.Net.HttpStatusCode.BadRequest;
                    _responsemsg.Content = new ObjectContent<JObject>(ResponseData, formatter, "application/json");
                    return _responsemsg;
                }
Odpovězeno 19/08/2019 v 12:31
zdroj uživatelem

hlasů
0

můžete zkusit to, ale musíte být jisti, typ hodnoty pro každý sloupec

List<MyClass> result = myDataTable.AsEnumerable().Select(x=> new MyClass(){
     Property1 = (string)x.Field<string>("ColumnName1"),
     Property1 = (int)x.Field<int>("ColumnName2"),
     Property1 = (bool)x.Field<bool>("ColumnName3"),    
});
Odpovězeno 01/02/2018 v 21:43
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more