LINQ क्वेरी परिणाम सेट से एक DataSet या DataTable भरना


137

LINM क्वेरी को ASMX वेब सेवा के रूप में कैसे उजागर करते हैं? आमतौर पर, बिजनेस टियर से, मैं एक टाइप किया हुआ रिटर्न दे सकता हूं DataSetया DataTableजिसे ASMX पर ट्रांसपोर्ट के लिए क्रमबद्ध किया जा सकता है।

मैं LINQ क्वेरी के लिए कैसे कर सकता हूं? वहाँ एक टाइप करने के लिए DataSetया DataTableLINQ क्वेरी के माध्यम से आबाद करने का एक तरीका है ?

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;
}

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

जवाबों:


87

जैसा कि प्रश्न में उल्लेख किया गया है, 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>();

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


29
हर कोई यह सोचकर कि CopyToDataTable () अपनी मशीन पर काम क्यों नहीं करता है: यह फ़ंक्शन .NET 3.5 SP1 का हिस्सा नहीं है और न ही यह .NET 4.0 का होगा; इसे IEnumerable <DataRows> तक सीमित कर दिया गया है और IEnumerable <T> - bit.ly/dL0G5 के
आदर्श वाक्य

26

किसी 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>;आपको निम्नलिखित संकलन त्रुटि दिखाई देगी:

स्पष्ट रूप से 'System.Collections.Generic.IEnumerable' प्रकार को 'System.Collections.Generic.IEnumerable' में नहीं बदल सकते। एक स्पष्ट रूपांतरण मौजूद है (क्या आप किसी कलाकार को याद कर रहे हैं?)


22

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


15

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



2

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

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>();

0

पूर्णता के लिए, ये समाधान EF Core (कम से कम EF Core 2.2 के लिए) के लिए काम नहीं करते हैं। कास्टिंग IEnumerable<DataRow>, जैसा कि यहां अन्य उत्तरों में सुझाया गया है, विफल रहता है। इस वर्ग को लागू करने और विस्तार के तरीकों ने मेरे लिए https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-dadrow पर काम किया ।

यह ईएफ कोर में क्यों नहीं बनाया गया है, मुझे नहीं पता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.