একটি ডেটা টেবিলের লাইনকিউ কোয়েরি


1031

আমি একটি ডেটা টেবল অবজেক্টে একটি লিনকিউ ক্যোয়ারী সম্পাদন করার চেষ্টা করছি এবং উদ্ভটভাবে আমি খুঁজে পাচ্ছি যে ডেটাটিবেলে এই জাতীয় অনুসন্ধান করা সহজ নয় is উদাহরণ স্বরূপ:

var results = from myRow in myDataTable
where results.Field("RowNo") == 1
select results;

এই অনুমতি দেওয়া হয় না. আমি এই কাজের মতো কিছু পেতে পারি?

আমি অবাক হয়েছি যে লিনকিউ কোয়েরিগুলি ডেটা টেবিলগুলিতে অনুমোদিত নয়!


উত্তর:


1279

বাস্তবায়ন না হওয়ায় আপনি DataTableএর সারি সংগ্রহের বিরুদ্ধে জিজ্ঞাসা করতে পারবেন না । এর জন্য আপনাকে এক্সটেনশনটি ব্যবহার করতে হবে । তাই ভালো:DataRowCollectionIEnumerable<T>AsEnumerable()DataTable

var results = from myRow in myDataTable.AsEnumerable()
where myRow.Field<int>("RowNo") == 1
select myRow;

এবং হিসাবে @Keith বলছেন, 'তুমি একটি রেফারেন্স যোগ করতে হবে System.Data.DataSetExtensions

AsEnumerable()আয় IEnumerable<DataRow>। আপনার যদি রূপান্তর IEnumerable<DataRow>করতে হয় DataTableতবে CopyToDataTable()এক্সটেনশনটি ব্যবহার করুন ।

নীচে ল্যাম্বদা এক্সপ্রেশন সহ ক্যোয়ারী রয়েছে,

var result = myDataTable
    .AsEnumerable()
    .Where(myRow => myRow.Field<int>("RowNo") == 1);

8
ভিবি সংস্করণ: ধীর ফলাফল = আমারআর থেকে MyDataTable.AsEeumerable _ যেখানে myRow.Field ("RowNo") = 1 _ আমার রো নির্বাচন করুন
জেফ

15
আমার কাছে ইতিমধ্যে উল্লিখিত using System.Data;
ডিএলটির

5
ভিবি সংস্করণটির জন্য MyRow.Field এবং ("RowNo") এর মধ্যে (অফ স্ট্রিং) toোকানো দরকার। এই অংশটি পড়তে হবে: myRow.Feld (অফ স্ট্রিং) ("রোউনো") = 1 - রেফারেন্স @ ক্রস মন্তব্য।
yougotiger

8
এই সমাধানটি অযথা জটিল is myDataTable.Rowsপরিবর্তে @ জোয়েলফ্যানের পরামর্শ অনুযায়ী ব্যবহার করুন ।
ষড়যন্ত্র

10
@ মারকাস কেবল স্পষ্ট করে বলতে গেলে, @ জোয়েলফ্যানের সমাধানটি যে কারণে কাজ করে myDataTable.Rowsতা হল myRowভেরিয়েবলটি স্পষ্টতই নিক্ষেপ করা হয়েছে DataRow। এটি সংকলিত হয়ে গেলে, সেই ক্যোয়ারিতে আবার লেখা হয় myDataTable.Rows.Cast<DataRow>().Where(myRow => (int)myRow["RowNo"] == 1)। ব্যক্তিগতভাবে, কলটি কল করার AsEnumerable()চেয়ে আমি আর জটিল কিছু পাই না Cast<DataRow>()। আমি যতদূর জানি, পারফরম্যান্স একই, সুতরাং এটি কেবল পছন্দের বিষয়।
কলিন কে

129
var results = from DataRow myRow in myDataTable.Rows
    where (int)myRow["RowNo"] == 1
    select myRow

2
একাধিক সারি নির্বাচন করার জন্য, কেবল সারি 1 এর পরিবর্তে?
আদজিৎ

2
কেবল "যেখানে" লাইনটি সরিয়ে ফেলুন এবং আপনি সমস্ত সারি পাবেন
জোয়েলফ্যান

1
হ্যাঁ, (int)myRow["RowNo"]জেনেরিক ফর্মটি প্রতিস্থাপনযোগ্যতর myRow.Field<int>("RowNo")প্রকারকে আরও স্বাচ্ছন্দ্যে সমর্থন করা বাদ দিয়ে আমি এটির মতোই এটি ব্যবহার করি ।
জোনাস

69

এটি এমন নয় যে তাদের ইচ্ছাকৃতভাবে ডেটা টেবিলগুলিতে অনুমতি দেওয়া হয়নি, এটি কেবলমাত্র ডেটা টেবিলগুলি আইটিক্যারেবল এবং জেনেরিক আইইনামেবল কনস্ট্রাক্টসের প্রাক-তারিখ যার উপর লিনক অনুসন্ধানগুলি সম্পাদন করা যেতে পারে।

উভয় ইন্টারফেসের জন্য কিছু প্রকারের সুরক্ষা বৈধতা প্রয়োজন। ডেটা টেবিলগুলি দৃ strongly়ভাবে টাইপ করা হয় না। উদাহরণস্বরূপ, লোকেদের অ্যারেলিস্টের বিরুদ্ধে জিজ্ঞাসা করতে না পারার কারণেই এটি।

লিনক কাজ করার জন্য আপনাকে টাইপ-সেফ অবজেক্টের বিরুদ্ধে আপনার ফলাফল ম্যাপ করতে হবে এবং তার পরিবর্তে কোয়েরি করতে হবে।


49

যেমন @ ch00k বলেছেন:

using System.Data; //needed for the extension methods to work

...

var results = 
    from myRow in myDataTable.Rows 
    where myRow.Field<int>("RowNo") == 1 
    select myRow; //select the thing you want, not the collection

আপনার একটি প্রকল্পের রেফারেন্স যুক্ত করতে হবে System.Data.DataSetExtensions


1
আপনি এই চেষ্টা করেন, তাহলে আপনি যদি না আপনি উপর একটি নির্দিষ্ট ধরনের করা পাবেন এটি কাজ করবে না myRowবা ব্যবহার Cast<DataRow>()উপর Rows। ব্যবহার করা ভাল AsEnumerable()
নেটমেজ

1
@ নেটমেজ এটি পোস্ট করেছে যখন 12 বছর আগে এটি কাজ করেছে। যতক্ষণ আপনার কাছে রয়েছে System.Linqএবং System.Data.DataSetExtensionsতারপরে যেকোন উপায়ে myDataTable.Rowsএকটি অগণিত সংগ্রহ প্রদান করে DataRow। এটি পরিবর্তিত হতে পারে, আমি এটি ব্যবহার করার পরে এক দশক হয়ে গেছে।
কীথ

1
আকর্ষণীয় - আমার ধারণা এটি কোনও সময়ে পরিবর্তিত হয়েছিল, কারণ এটি নেট। বা নেট নেট এখন কাজ করে না।
নেটমেজ

1
@ নেটমেজ হ্যাঁ, আমি বিস্মিত হই না যে DataSetএক্সটেনশানগুলি এটি। নেট কোর বা। নেট স্ট্যান্ডার্ড হিসাবে তৈরি করে নি, আমি এই উত্তরটি পোস্ট করার পরে সেগুলি ইতিমধ্যে পুরানো ছিল। আমি DataSetনতুন প্রকল্পগুলিতে সত্যই ব্যবহার করব না, কোডিং এবং পারফরম্যান্স উভয়ের পক্ষে আরও অনেক ভাল ডেটা অ্যাক্সেস মডেল রয়েছে।
কীথ

1
তারা সেখানে আছে, কিন্তু DataRowCollectionবাস্তবায়ন নেই IEnumerable<T>শুধু IEnumerableতাই শক্তিশালী ভাবে টাইপ LINQ সঙ্গে কাজ করে না।
নেটমেজ

38
var query = from p in dt.AsEnumerable()
                    where p.Field<string>("code") == this.txtCat.Text
                    select new
                    {
                        name = p.Field<string>("name"),
                        age= p.Field<int>("age")                         
                    };

নাম এবং বয়স ক্ষেত্রগুলি এখন ক্যোয়ারী অবজেক্টের অংশ এবং এটির মতো অ্যাক্সেস করা যেতে পারে: কনসোল.উরাইটলাইন (ক্যোয়ার.নেম);


আমি কীভাবে নাম ব্যবহার করব? উদাহরণস্বরূপ, MessageBox.Show(name)অপরিজ্ঞাত।

35

আমি বুঝতে পারি এর কয়েকবার উত্তর দেওয়া হয়েছে, তবে কেবল অন্য পদ্ধতির প্রস্তাব দেওয়ার জন্য:

আমি .Cast<T>()পদ্ধতিটি ব্যবহার করতে চাই , এটি সুস্পষ্ট ধরণের সংজ্ঞায়িত এবং গভীরভাবে আমার মনে হয় .AsEnumerable()এটিকে যেভাবে কল করে তা দেখে সন্তুষ্টি বজায় রাখতে সহায়তা করে :

var results = from myRow in myDataTable.Rows.Cast<DataRow>() 
                  where myRow.Field<int>("RowNo") == 1 select myRow;

অথবা

var results = myDataTable.Rows.Cast<DataRow>()
                      .FirstOrDefault(x => x.Field<int>("RowNo") == 1);

মন্তব্যে উল্লিখিত হিসাবে, লিনকের ( রেফারেন্স ) অংশ হিসাবে অন্য কোনও সমিতি দরকার নেই


5
এটি সিস্টেম.ডাটা.ডাটাসেট এক্সটেনশনগুলি উল্লেখ ছাড়াই কাজ করে।
ব্যবহারকারী423430

29

ডেটাসেট / ডেটাটেবেলে ডেটা ম্যানিপুলেট করতে লিনকিউ ব্যবহার করা

var results = from myRow in tblCurrentStock.AsEnumerable()
              where myRow.Field<string>("item_name").ToUpper().StartsWith(tbSearchItem.Text.ToUpper())
              select myRow;
DataView view = results.AsDataView();

1
AsDataView আমার জন্য ইন্টেলিসেন্সে উপস্থিত হয় না। আমি System.Data.Linq ব্যবহার করে এবং System.Linq ব্যবহার অন্তর্ভুক্ত করেছি কিন্তু এখনও এটি কাজ করছে না। তুমি কি জান আমি কী মিস করছি? আগাম ধন্যবাদ.
নওমী

@ নাওমি এটি এসেছে System.Data.DataSetExtensions
লুই ওয়াওয়ারু

29
//Create DataTable 
DataTable dt= new DataTable();
dt.Columns.AddRange(new DataColumn[]
{
   new DataColumn("ID",typeof(System.Int32)),
   new DataColumn("Name",typeof(System.String))

});

//Fill with data

dt.Rows.Add(new Object[]{1,"Test1"});
dt.Rows.Add(new Object[]{2,"Test2"});

//Now  Query DataTable with linq
//To work with linq it should required our source implement IEnumerable interface.
//But DataTable not Implement IEnumerable interface
//So we call DataTable Extension method  i.e AsEnumerable() this will return EnumerableRowCollection<DataRow>


// Now Query DataTable to find Row whoes ID=1

DataRow drow = dt.AsEnumerable().Where(p=>p.Field<Int32>(0)==1).FirstOrDefault();
 // 

22

এই সহজ ক্যোয়ারী লাইনটি ব্যবহার করে দেখুন:

var result=myDataTable.AsEnumerable().Where(myRow => myRow.Field<int>("RowNo") == 1);

4
আমি " মেইন চেইনিং " (যেমন আপনি এখানে করেছেন) " কোয়েরি সিনট্যাক্স " (স্বীকৃত উত্তরে) এর চেয়ে বেশি পছন্দ করি কেবল কারণ এটি একটি মৌলিক যেখানে ধারাটি একটি লাইনে ফিট করে এবং এখনও খুব পঠনযোগ্য। প্রতিটি তাদের নিজস্ব।
মাইকটাইভি

16

সারি সারণে অবজেক্টগুলিতে আপনি লিনকিউ ব্যবহার করতে পারেন:

var results = from myRow in myDataTable.Rows where myRow.Field("RowNo") == 1 select myRow;

1
কারণ DataTable.Rowsবাস্তবায়ন নেই IEnumerable, আমি কেমন এই প্রশ্নের সাথে কম্পাইল পারে দেখতে পাবে না।
onedaywhen

@ এমনেদয়নে যখন আমি দেখেছি এটি কিছু কোডে করা হচ্ছে এবং এটি সংকলন করে। এখনই কেন তা জানার চেষ্টা করা হচ্ছে।
বিভেরনন

... বা আপনি কেবল নির্বাচন পদ্ধতিতে একটি ফিল্টার এক্সপ্রেশন ব্যবহার করতে পারেন: var ফলাফল = myDataTable.Select ("RowNo = 1"); এটি একটি ডাটাআর অ্যারে প্রদান করে।
ইশিকাওয়া

12

এটি একটি সহজ উপায় যা আমার পক্ষে কাজ করে এবং ল্যাম্বদা এক্সপ্রেশন ব্যবহার করে:

var results = myDataTable.Select("").FirstOrDefault(x => (int)x["RowNo"] == 1)

তারপরে আপনি যদি একটি নির্দিষ্ট মান চান:

if(results != null) 
    var foo = results["ColName"].ToString()


11

সম্ভবত, ডাটাসেট, ডেটা টেবিল এবং ডেটা রো এর ক্লাসগুলি ইতিমধ্যে সমাধানে সংজ্ঞায়িত করা হয়েছে। যদি এমনটি হয় তবে আপনার ডেটাসেট এক্সটেনশন রেফারেন্সের প্রয়োজন হবে না।

যাত্রা। ডেটাসেট শ্রেণীর নাম-> কাস্টমসেট, ডেটারো শ্রেণীর নাম-> কাস্টম টেবিলরো (সংজ্ঞায়িত কলামগুলির সাথে: রোউনো, ...)

var result = from myRow in myDataTable.Rows.OfType<CustomSet.CustomTableRow>()
             where myRow.RowNo == 1
             select myRow;

বা (আমি যেমন পছন্দ করি)

var result = myDataTable.Rows.OfType<CustomSet.CustomTableRow>().Where(myRow => myRow.RowNo);


8

আমার অ্যাপ্লিকেশনটিতে আমি দেখতে পেয়েছি যে উত্তরটিতে প্রস্তাবিত হিসাবে ডেটাবেলের জন্য AsEnumerable () এক্সটেনশন সহ ডেটাসেটগুলিতে LINQ ব্যবহার করা অত্যন্ত ধীর ছিল। আপনি যদি গতির জন্য অনুকূলিতকরণে আগ্রহী হন, তবে জেমস নিউটনকিংয়ের জসন. নেট লাইব্রেরিটি ব্যবহার করুন ( http://james.newtonking.com/json/help/index.html )

// Serialize the DataTable to a json string
string serializedTable = JsonConvert.SerializeObject(myDataTable);    
Jarray dataRows = Jarray.Parse(serializedTable);

// Run the LINQ query
List<JToken> results = (from row in dataRows
                    where (int) row["ans_key"] == 42
                    select row).ToList();

// If you need the results to be in a DataTable
string jsonResults = JsonConvert.SerializeObject(results);
DataTable resultsTable = JsonConvert.DeserializeObject<DataTable>(jsonResults);

আমি সন্দেহ করি এটি সাধারণ ক্ষেত্রে, এটি আরও দ্রুত। এটিতে দুটি সিরিয়ালাইজেশনের ওভারহেড রয়েছে, একটি ডিসিরিয়ালাইজেশন এবং একটি পার্সিং অপারেশন। নির্বিশেষে, আমি হ্রাস পেয়েছি কারণ এটি সংক্ষিপ্ত নয়, অর্থাৎ সিরিয়ালাইজেশন / deserialization পরিষ্কার করে না যে উদ্দেশ্যটি কোনও তালিকা ফিল্টার করে।
একটি ফু

@an phu, .AsNeumerable এক্সটেনশন পদ্ধতিটি ব্যবহার করে হেভিওয়েট System.Data.DataRowঅবজেক্টগুলির একটি সংগ্রহ তৈরি করা হয় । সিরিয়ালযুক্ত এবং পার্সড ডেটা টেবিলটি প্রতিটি সারিটির কেবলমাত্র কলামের নাম এবং মান সমন্বিত লাইটওয়েট ডেটা তৈরি করে। যখন কোয়েরিটি চলবে, এটি ডেটা মেমোরিতে লোড করবে, যা কোনও বড় ডেটাসেটের জন্য অদলবদল করতে পারে। কখনও কখনও, বেশিরভাগ অপারেশনের ওভারহেড মেমরির বাইরে থাকা এবং প্রচুর পরিমাণে ডেটা অনুলিপি করার ওভারহেডের চেয়ে কম হয়।
ল্যান্ডডেনজেন্টি

7

ভিবি.এনইটি-র জন্য কোডটি দেখতে পাবেন:

Dim results = From myRow In myDataTable  
Where myRow.Field(Of Int32)("RowNo") = 1 Select myRow

7
IEnumerable<string> result = from myRow in dataTableResult.AsEnumerable()
                             select myRow["server"].ToString() ;

7

নীচে সরবরাহ করা কীভাবে এটি অর্জন করবেন তার উদাহরণ:

DataSet dataSet = new DataSet(); //Create a dataset
dataSet = _DataEntryDataLayer.ReadResults(); //Call to the dataLayer to return the data

//LINQ query on a DataTable
var dataList = dataSet.Tables["DataTable"]
              .AsEnumerable()
              .Select(i => new
              {
                 ID = i["ID"],
                 Name = i["Name"]
               }).ToList();

6

এটা চেষ্টা কর...

SqlCommand cmd = new SqlCommand( "Select * from Employee",con);
SqlDataReader dr = cmd.ExecuteReader( );
DataTable dt = new DataTable( "Employee" );
dt.Load( dr );
var Data = dt.AsEnumerable( );
var names = from emp in Data select emp.Field<String>( dt.Columns[1] );
foreach( var name in names )
{
    Console.WriteLine( name );
}

5

আপনি এ জাতীয় লিঙ্কের মাধ্যমে মার্জিত কাজ পেতে পারেন:

from prod in TenMostExpensiveProducts().Tables[0].AsEnumerable()
where prod.Field<decimal>("UnitPrice") > 62.500M
select prod

অথবা ডায়নামিক লিনকের মতো এটি (এ্যাসডাইনামিককে সরাসরি ডেটাসেটে ডাকা হয়):

TenMostExpensiveProducts().AsDynamic().Where (x => x.UnitPrice > 62.500M)

আমি সর্বশেষতম পদ্ধতির পছন্দ করি যখন এটি সবচেয়ে নমনীয়। PS: System.Data.DataSetExtensions.dllরেফারেন্স সংযোগ করতে ভুলবেন না


5

আপনি এটি চেষ্টা করতে পারেন, তবে প্রতিটি কলামের মানগুলির ধরণটি অবশ্যই আপনার অবশ্যই নিশ্চিত

List<MyClass> result = myDataTable.AsEnumerable().Select(x=> new MyClass(){
     Property1 = (string)x.Field<string>("ColumnName1"),
     Property2 = (int)x.Field<int>("ColumnName2"),
     Property3 = (bool)x.Field<bool>("ColumnName3"),    
});

পৃথিবী কি পাগল হয়ে গেছে? স্কেলের সাথে কী ভুল? ডাটাআরও [] ডিআরএস = ডিটি। নির্বাচন করুন ("আইডি = 1"); সম্ভবত এটি খুব সহজ।
প্রোগ্রামনিক

0

আমি নিম্নলিখিত সমাধান প্রস্তাব:

DataView view = new DataView(myDataTable); 
view.RowFilter = "RowNo = 1";
DataTable results = view.ToTable(true);

ডেটাভিউ ডকুমেন্টেশনের দিকে তাকানো , প্রথম জিনিসটি আমরা দেখতে পাচ্ছি এটি হ'ল:

বাছাই, ফিল্টারিং, অনুসন্ধান, সম্পাদনা, এবং নেভিগেশনের জন্য একটি ডেটাবেইন্ডাল, কাস্টমাইজড ভিউ প্রতিনিধিত্ব করে।

আমি এটি থেকে যা পাচ্ছি তা হ'ল ডেটা টেবিল কেবলমাত্র ডেটা সঞ্চয় করার জন্য এবং ডেটাভিউ সেখানেই আমাদের ডেটা টেবিলের বিপরীতে "ক্যোয়ারী" করতে সক্ষম করে।

এই বিশেষ ক্ষেত্রে এটি কীভাবে কাজ করে তা এখানে:

আপনি এসকিউএল বিবৃতি কার্যকর করার চেষ্টা করুন try

SELECT *
FROM myDataTable
WHERE RowNo = 1

"ডেটাটেবল ভাষা" এ। সি # তে আমরা এটি পড়ব:

FROM myDataTable
WHERE RowNo = 1
SELECT *

যা সি # তে এরকম দেখাচ্ছে:

DataView view = new DataView(myDataTable);  //FROM myDataTable
view.RowFilter = "RowNo = 1";  //WHERE RowNo = 1
DataTable results = view.ToTable(true);  //SELECT *

0
                    //Json Formating code
                    //DT is DataTable
                    var filter = (from r1 in DT.AsEnumerable()

                                  //Grouping by multiple columns 
                                  group r1 by new
                                  {
                                      EMPID = r1.Field<string>("EMPID"),
                                      EMPNAME = r1.Field<string>("EMPNAME"),

                                  } into g
                                  //Selecting as new type
                                  select new
                                  {

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