2008-08-01 9 views
106

आप LINQ क्वेरी को एएसएमएक्स वेब सेवा के रूप में कैसे बेनकाब करते हैं? आम तौर पर, व्यवसाय स्तर से, मैं एक टाइप DataSet या DataTable वापस कर सकता हूं जिसे एएसएमएक्स पर परिवहन के लिए क्रमबद्ध किया जा सकता है।LINQ क्वेरी परिणाम से डेटासेट या डेटाटेबल भरना

मैं LINQ क्वेरी के लिए ऐसा कैसे कर सकता हूं? क्या LINQ क्वेरी के माध्यम से टाइप किए गए DataSet या DataTable को पॉप्युलेट करने का कोई तरीका है?

public static MyDataTable CallMySproc() 
{ 
    string conn = "..."; 

    MyDatabaseDataContext db = new MyDatabaseDataContext(conn); 
    MyDataTable dt = new MyDataTable(); 

    // execute a sproc via LINQ 
    var query = from dr 
       in db.MySproc().AsEnumerable 
       select dr; 

    // copy LINQ query resultset into a DataTable -this does not work !  
    dt = query.CopyToDataTable(); 

    return dt; 
} 

मैं एक DataSet या DataTable में एक LINQ क्वेरी का परिणाम सेट प्राप्त कर सकते हैं कैसे? वैकल्पिक रूप से, LINQ क्वेरी serializeable है ताकि मैं इसे एएसएमएक्स वेब सेवा के रूप में उजागर कर सकूं?

उत्तर

73

प्रश्न में उल्लेख किया है, IEnumerable एक CopyToDataTable विधि है:

IEnumerable<DataRow> query = 
    from order in orders.AsEnumerable() 
    where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1) 
    select order; 

// Create a table from the query. 
DataTable boundTable = query.CopyToDataTable<DataRow>(); 

क्यों नहीं होगा आप के लिए है कि काम करता है?

+28

हर किसी के लिए सोच क्यों CopyToDataTable() उनकी मशीन पर काम नहीं करता है: यह फ़ंक्शन .NET 3.5 SP1 का हिस्सा नहीं है और न ही यह .NET 4.0 का होगा; इसे IENumerable तक सीमित कर दिया गया है और यह IENumerable - http://bit.ly/dL0G5 के लिए काम नहीं करता है – motto

13

यदि आप IEnumerable के रिटर्न प्रकार का उपयोग करते हैं, तो आप अपने क्वेरी क्वेरी को सीधे वापस कर सकते हैं।

7

कक्षा ऑब्जेक्ट बनाएं और क्वेरी के list(T) वापस करें।

18

डेटा ट्रांसफर ऑब्जेक्ट्स का एक सेट बनाएं, कुछ मैपर, और .asmx के माध्यम से इसे वापस करें।
आपको कभी डेटाबेस ऑब्जेक्ट्स का खुलासा नहीं करना चाहिए, क्योंकि प्रक्रिया स्कीमा में बदलाव वेब सेवा उपभोक्ता को बिना किसी ध्यान के प्रचारित करेगा।

22

एक DataContext वर्ग के खिलाफ इस क्वेरी करने के लिए, आपको निम्न कार्य करने की आवश्यकता होगी: बिना

MyDataContext db = new MyDataContext(); 
IEnumerable<DataRow> query = 
    (from order in db.Orders.AsEnumerable() 
     select new 
     { 
      order.Property, 
      order.Property2 
     }) 
    as IEnumerable<DataRow>; 
return query.CopyToDataTable<DataRow>(); 

as IEnumerable<DataRow>; आप निम्नलिखित संकलन त्रुटि देखेंगे:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)

संबंधित मुद्दे