Bir LINQ sorgu sonuç kümesinden bir DataSet veya DataTable doldurma


137

LINQ sorgusunu ASMX web hizmeti olarak nasıl açığa çıkarırsınız? Genellikle, iş katmanından, ASMX üzerinden taşıma için seri halde DataSetveya DataTableseri hale getirilebilir.

Aynı şeyi bir LINQ sorgusu için nasıl yapabilirim? Yazılan DataSetveya DataTableLINQ sorgusu aracılığıyla doldurmanın bir yolu var mı ?

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 sorgusunun sonuç kümesini bir DataSetveya biçimine nasıl alabilirim DataTable? Alternatif olarak, LINQ sorgusu ASMX web hizmeti olarak gösterebilir böylece serileştirilebilir mi?

Yanıtlar:


87

Soruda belirtildiği gibi IEnumerable, bir CopyToDataTableyöntemi vardır:

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

Bu senin için neden işe yaramıyor?


29
CopyToDataTable () 'ın makinelerinde neden çalışmadığını merak eden herkese: Bu işlev .NET 3.5 SP1'in bir parçası değildir. IEnumerable <DataRows> ile sınırlandırılmıştır ve IEnumerable <T> - bit.ly/dL0G5
sloganı

26

Bu sorguyu bir DataContextsınıfa karşı gerçekleştirmek için aşağıdakileri yapmanız gerekir:

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

Bu olmadan, as IEnumerable<DataRow>;aşağıdaki derleme hatasını göreceksiniz:

'System.Collections.Generic.IEnumerable' türü dolaylı olarak 'System.Collections.Generic.IEnumerable' türüne dönüştürülemiyor. Açık bir dönüşüm var (oyuncu kadrosu eksik mi?)


22

Bir dizi Veri Aktarımı Nesnesi, birkaç eşleyici oluşturun ve bunu .asmx aracılığıyla döndürün.
Sen gerektiğini asla prosedür şemasındaki bir değişiklik fark olmadan web hizmeti tüketiciye yaymak gibi, doğrudan veritabanı nesnelerini maruz.


15

Dönüş türü kullanırsanız IEnumerable, sorgu değişkeninizi doğrudan döndürebilirsiniz .



2

IEnumerableDönüş türü olarak kullanırsanız , sorgu değişkeniniz doğrudan döndürülür.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.