একটি লিনকিউ কোয়েরি ফলাফল সেট থেকে একটি ডেটাসেট বা ডেটা টেবিল পূরণ করা


137

আপনি কীভাবে একটি এএসএমএক্স ওয়েব পরিষেবা হিসাবে একটি লিনকিউ ক্যোয়ারী প্রকাশ করবেন? সাধারণত, ব্যবসায়ের স্তর থেকে, আমি কোনও টাইপ ফিরিয়ে দিতে পারি DataSetবা DataTableএএসএমএক্সের মাধ্যমে পরিবহনের জন্য সিরিয়ালাইজ করা যায়।

আমি কীভাবে লিনকিউ ক্যোয়ারির জন্য একই কাজ করতে পারি? কোনও টাইপ করা 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? বিকল্পভাবে, লিনকিউ কোয়েরি সিরিয়ালাইজযোগ্য যাতে আমি এএসএমএক্স ওয়েব পরিষেবা হিসাবে প্রকাশ করতে পারি?

উত্তর:


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
প্রত্যেকের কাছেই ভাবছে কেন কপিডোডেটা টেবল () তাদের মেশিনে কাজ করে না: এই ফাংশনটি নেট নেট এসপি 1 এর অংশ নয় বা এটি নেট নেট 4.0 এর অংশ হবে না; এটা IEnumerable <DataRows> সীমাবদ্ধ করা হয়েছে এবং এর জন্য IEnumerable <টি> কাজ করে - 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>;নিম্নলিখিত সংকলন ত্রুটি দেখতে পাবেন:

স্পষ্টভাবে 'সিস্টেম.কলেশনস.জেনারিক.আইইনিউরেবল' টাইপকে 'সিস্টেম.কলেশনস.জেনেরিক.আইইনুমারেবল' তে রূপান্তর করতে পারে না। একটি সুস্পষ্ট রূপান্তর বিদ্যমান (আপনি কি একটি কাস্ট মিস করছেন?)


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 কোরের জন্য কাজ করে না (অন্তত EF কোর ২.২ এর জন্য নয়)। IEnumerable<DataRow>এখানে অন্যান্য উত্তরের পরামর্শ অনুসারে কাস্ট করা ব্যর্থ। এই শ্রেণিটি প্রয়োগ করা এবং সম্প্রসারণ পদ্ধতিগুলি আমার জন্য কাজ করেছে https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow

এটি কেন EF কোর মধ্যে নির্মিত হয় না, আমার ধারণা নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.