PDA

View Full Version : جستجو در DataTable با استفاده از LINQ (LINQ to DataSet)



piroozman
شنبه 21 آذر 1388, 16:45 عصر
در یکی از پروژه ها جستجو ها روی DataTable ها انجام می شود. برای این کار ابتدا محتویات DataTabel مورد نظر را داخل یک متغیر از نوع همان DataTable با نام dtProjectCaption کپی می کنم. به کد زیر توجه کنید:



dtProjectCaption = (AgreementDataSet.ProjectCaptionDataTable)
this.agreementDataSet.ProjectCaption.Copy();

حال یک Qury با استفاده از LINQ روی DataTable فوق انجام داده ام. جستجوی مورد نظر روی ستون PlaceCode از جدول dtProjectCation انجام می پذیرد. نوع این ستون Strig است. مقادیر جستجوی مورد نظر را داخل یک متغیر بی نوع با نام queryProjectCaption ریخته ام.




var queryProjectCaption = from q in dtProjectCaption
where q.PlaceCode.Equals("20")
select q;



در نهایت مقادیر موجود در جدول اصلی را خالی می کنم:






this.agreementDataSet.ProjectCaption.Clear();





و با استفاده از یکی از توابع مختص متغیر queryProjectCaption تمامی پرس و جوی حاصل را داخل جدول اصلی خود کپی می کنم:



queryProjectCaption.CopyToDataTable(this.agreement DataSet.ProjectCaption,LoadOption.OverwriteChanges );


حال سئوال اینجاست که با این که می دانم داخل DataTable اصلی یعنی ProjectCaption ستون PlaceCode دارای مقدار 20 است اما پرس و جوی مورد نظر هیچ ردیفی را برای من بر نمی گرداند.
ضمنا وقتی که در Sql یک Query بر همین اساس می نویسم به طوری که انتهای رشته مورد نظر برابر با صفر باشد باز هم هیچ ردیفی بازپس داده نمی شود. به کد زیر توجه کنید:




Select * from projectCaption where PlaceCode like N'%0'



لازم به توضیح است که نوع ستون PlaceCode از نوع nvarchar(10) است.
از کلیه دوستانی که بنده را راهنمایی می نمایند قبلا تشکر می کنم.

hdv212
یک شنبه 22 آذر 1388, 12:38 عصر
لطفا یک BreakPoint در ابتدای خطی که دیتاست رو Clear میکنید قرار بدید و در RunTime ببینید متغیر queryProjectCaption دارای رکورد هست یا نه، اگر دارای رکورد هست، خط بعدی رو اجرا کنید (کلید F11 رو بزنید)، یعنی همون خطی که دیتاست رو Clear میکنه، دوباره مقدار متغیر queryProjectCaption رو ببینید، احتمالا دیگه مقداری نداره و با Clear کردن دیتاست، مقادیر queryProjectCaption هم پاک میشه، دلیلش هم اینه که داده های موجود در queryProjectCaption همون داده های موجود در دیتاست هستند و در اصل مقادیر queryProjectCaption ارجاعی به مقادیر دیتاست هست و مقادیر جدید در متغیر queryProjectCaption کپی نمیشوند، درنتیجه با پاک کردن دیتاست، در حقیقت مقادیر queryProjectCaption رو هم پاک میکنید. برای حل این مشکل میتونید از یک دیتاتیل اضافی کمک بگیرید، بدین صورت که پس از کوئری گرفتن، اونو در داخل این دیتاتیبل جدید کپی کنید و بعد دیتاست رو پاک کنید و سپس اطلاعات دیتاتیبل کمکی رو در داخل دیتاست مورد نظرتون Merge کنید.
مثال زیر نمونه از جدول Customers در دیتابیس Northwind میباشد که در اینجا مشتری هایی که از کشور USA هستند رو پیدا میکنیم و به روش فوق بقیه مسیر رو طی میکنید :


var query = from c in this.northwindDatSet.Customers
where c.Country == "USA"
select c;

NorthwindDataSet.CustomersDataTable dtUsa = new NorthwindDataSet.CustomersDataTable();
query.CopyToDataTable(dtUsa, LoadOption.OverwriteChanges);
this.northwindDatSet.Customers.Clear();
this.northwindDatSet.Customers.Merge(dtUsa);

this.dataGridView1.DataSource = this.northwindDatSet.Customers;
dtUsa.Dispose();

دقت کنید که آبجکت dtUsa همونه دیتاتیبل کمکی ما هست.
موفق باشید.

piroozman
دوشنبه 23 آذر 1388, 08:28 صبح
لطفا یک BreakPoint در ابتدای خطی که دیتاست رو Clear میکنید . . .
ضمن تقدير و تشكر از جنابعالي خدمت شما عرض كنم اگر دقت فرماييد بنده همون كاري را كه جنابعالي بيان داشتيد انجام داده ام. اما ديشب متوجه اشتباه خود شدم. ستوني كه بنده قصد جستجو در آن داشتم از نوع nchar(10) بود. همانگونه كه مستحضريد اين نوع درصورتي كه تعداد داده هاي ورودي كمتر از 10 كاراكتر باشد مابقي را با فضاي خالي يا اصطلاحاً Space پر مي كند. به طور مثال اگر شما مقدار 20 را ذخيره كنيد مابقي فضا يعني تعداد هشت كاراكتر فضاي خالي نيز به همراه آن ذخيره مي شود. حال اگر شما بخواهيد دنبال ركوردي هايي بگرديد كه بر اساس اين ستون باشد و نيز انتهاي آنها 0 باشد هيچ چيز پيدا نخواهيد كرد.
باز هم كمال تشكر را از شما دارم كه وقت گذاشته و بنده را شرمنده مرام خوب خودتان مي كنيد. با تشكر

saeid69
سه شنبه 24 آذر 1388, 20:46 عصر
query.CopyToDataTable(dtUsa, LoadOption.OverwriteChanges);


میشه بیشتر در مورد این خط توضیح بدین آخه query متد CopyToDataTable رو نداره

piroozman
چهارشنبه 25 آذر 1388, 13:12 عصر
میشه بیشتر در مورد این خط توضیح بدین آخه query متد CopyToDataTable رو نداره

اگر شما کل مقدار query را بازپس دهید این مشکل را نخواهید داشت ولی اگر فقط ستونهای خاصی از یک query را بخواهید بارگردانید این تابع در اختیار شما نخواهد بود. به طور مثال به کد زیر توجه کنید:

var queryStateCity = from c in cityDT
join s in stateDT on c.StateId equals s.StateId
select new { s.StateName, c.CityName };
دقت داشته باشید منظورم اینه که به طور مثال دو جدول cityDT و stateDT دارای ستونهای دیگری به جز دو ستون cityName و stateName نیز هستند ولی چون فقط به این دوستون نیاز است از عبارت
select new { s.StateName, c.CityName } نوشته شود.
البته این چیزیه که تا حالا خودم متوجه شدم و شاید گفته های من صحت کامل نداشته باشه ولی به هر حال وقتی من این کار را انجام می دهم دیگر تابع CopyToDataTable را در اختیار ندارم. حال از دوستان دیگر تقاضا دارم در صورتی که می دانند چگونه می توان یک query را در داخل یک DataTable کپی (کرد البته بدون استفاده از تابع فوق) ممنون می شم بازگو کنند.