سؤال

وكيف فضح استعلام LINQ كخدمة ويب ASMX؟ عادة، من الطبقة الأعمال التجارية، ويمكن إرجاع DataSet كتبته أو DataTable التي يمكن إجراء تسلسل للنقل عبر ASMX.

وكيف يمكن أن أفعل نفس الشيء للاستعلام LINQ؟ هل هناك طريقة لتجميع DataSet مكتوب أو DataTable عبر استعلام LINQ؟

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؟

هل كانت مفيدة؟

المحلول

وكما ذكر في السؤال، 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>();

وماذا لا أن العمل بالنسبة لك؟

نصائح أخرى

لأداء هذا الاستعلام ضد فئة 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. توجد مشكلة تحويل صريح (التي تفتقد يلقي؟)

تأكد مجموعة من كائنات نقل البيانات، وزوجين من المخططون، والعودة التي عبر .asmx.
يجب عليك <م> لا فضح كائنات قاعدة البيانات مباشرة، كتغيير في مخطط الإجراء سوف تنتشر إلى المستهلك خدمة الإنترنت دون أن يلاحظ ذلك.

إذا كنت تستخدم نوع عودة IEnumerable، يمكنك العودة الخاص بك على الاستعلام متغير مباشرة.

إنشاء كائن فئة والعودة list(T) الاستعلام.

إذا كنت تستخدم نوع عودة IEnumerable.It يساعد العودة متغير الاستعلام الخاص بك مباشرة.

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>();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow