2012-04-30 13 views
5

मेरे पास बड़ा डेटाटेबल है, मैं डेटाटेबल के रूप में प्रतिनिधित्व किए गए इस डेटाटेबल का सबसेट प्राप्त करना चाहता हूं। संक्षेप में कह रहा है कि मैं डेटाटेबल में विशेष कॉलम कैसे चुनूं।LINQ से डेटाटेबल

मैं कुछ इस तरह की कोशिश कर रहा था, लेकिन यह काम नहीं करता ...

DataTable dTable = new DataTable(); 
... 
... 
... 
     DataTable dt = from field in dTable 
         where field.Field<string>("Manager") 
         where field.Field<string>("Phone") 
         select field; 

शायद मेरे कोड गलत है, मैं कैसे बिना एक DataTable से "प्रबंधकों" और "फ़ोन" कॉलम मिलता है लूपिंग ने सोचा?

+0

आप क्या एक्सेस कर रहे हैं? एसक्यूएल? सीएलआर ऑब्जेक्ट्स? – Tormod

+0

नहीं, मैं डेटाटेबल –

+0

तक पहुंच रहा हूं, क्या आप कहेंगे कि आपकी मदद करने के लिए आपका उद्देश्य क्या है, आपके वर्तमान कोड से मैं समझ नहीं पा रहा हूं कि आप क्या चाहते हैं (दो नेस्टेड 'कहां?) –

उत्तर

4

संदर्भ DataTableExtensions -

http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx

फिर

...

var whatever = dTable.AsEnumerable(); 
MSDN उदाहरण प्रति

फिर ...

var productNames = from products in table.AsEnumerable() 
     select products.Field<string>("ProductName"); 

संपादित करें/अद्यतन: दुर्भाग्य से मुझे क्या करना ऐसा नहीं लगता कि एक अलग-अलग के साथ डेटाटेबल पर प्रत्यक्ष कलाकारों का निर्माण किया गया है एनटी स्कीमा। डेटाटेबल का उपयोग करने के लिए में है? मुझे विश्वास है ... क्योंकि यह आपके कोड को दोबारा जांचने और परीक्षण करने के लिए बहुत अधिक प्रयास हो सकता है। शुभकामनाएं और दृढ़ता से टाइप की गई सूचियों के साथ काम करने के रूप में हमें पोस्ट करें और अधिक मजेदार हैं।

+0

धन्यवाद क्रिस! लेकिन मुझे परिणामस्वरूप छोटे डेटाटेबल प्राप्त करना होगा। –

+1

@ विल्डगोएट: ['CopyToDataTable'] (http://msdn.microsoft.com/en-us/library/bb396189.aspx) वह है जिसे आप ढूंढ रहे हैं। दुर्भाग्यवश परिणामस्वरूप डेटाटेबल में मूल डेटाटेबल के समान स्कीमा (फ़ील्ड्स) होना चाहिए। तो संक्षेप में: यह संभव नहीं है। लंबा संस्करण जो किसी भी तरह के अज्ञात प्रकारों के साथ काम करता है: http://stackoverflow.com/a/9259348/284240 –

2

आप लिख सकते हैं:

var query = from row in dTable.AsEnumerable() 
     select new 
     { 
     manager = row.Field<string>("Manager"), 
     phone = row.Field<string>("Phone")       
     }; 
1

आप AsEnumerable की मदद से डेटासेट पर DataTable या विशिष्ट मेज पर LINQ क्वेरी निष्पादित कर सकते हैं।

यहां उदाहरण है यह उपयोगी हो सकता है।

DataSet ds = new DataSet(); 
    DataTable dt = new DataTable(); 
    DataColumn dc; 
    DataRow dr; 
    ds.DataSetName = "products"; 
    dt.TableName = "product"; 

    dc = new DataColumn("product_id",long.MaxValue.GetType()); 
    dt.Columns.Add(dc); 

    dc = new DataColumn("product_name"); 
    dt.Columns.Add(dc); 

    dr = dt.NewRow(); 
    dr["product_id"] = 1; 
    dr["product_name"] = "Monitor"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 2; 
    dr["product_name"] = "Mouse"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 3; 
    dr["product_name"] = "KeyBoard"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 4; 
    dr["product_name"] = "LCD"; 
    dt.Rows.Add(dr); 

    ds.Tables.Add(dt); 

    IEnumerable<DataRow> objResult1 = from tbl in dt.AsEnumerable() 
            where tbl.Field<long>(0) <= 2 
            select tbl; 

    Response.Write("<b>Query Results 1</b>"); 
    foreach (DataRow row in objResult1) 
    { 
     Response.Write(string.Format("<br/>Product ID: {0} , Product Name: {1}", row.Field<long>(0), row.Field<string>(1))); 
    } 

    IEnumerable<DataRow> objResult2 = from tbl in ds.Tables[0].AsEnumerable() 
            let product_name = tbl.Field<string>(1) 
            where product_name.StartsWith("Key") 
            || product_name.StartsWith("Mo") 
            select tbl; 

    Response.Write("<br/><br/><b>Query Results 2</b>"); 
    foreach (DataRow row in objResult2) 
    { 
     Response.Write(string.Format("<br/>Product ID: {0} , Product Name: {1}", row.Field<long>(0), row.Field<string>(1))); 
    }