PDA

View Full Version : سوال: select رکوردهایی از جدول اول به شرطی که شناسه آنها در جدول دوم نباشد.



vB.N3T
جمعه 20 آذر 1394, 17:03 عصر
سلام دوستان عزیز

1.جدول اول مشخصات فردی ثبت میکه
2.جدول دوم مشخصات پرداخت ماهانه رو

من با این کوئری نام افراد پرداخت کننده رو سلکت کردم

var query3 = from t1 in db.tbl_farmers
join t2 in db.Tbl_dareyaftis
on t1.number_farmer equals t2.id_p
where t2.date == dateTimeSelector1.GetText("yyyy/MM/dd")
select new
{
NameProdect = t1.Name,
mablagh = t2.Price,
datee = t2.date,
vaziat = t2.vaziat,
tedadr = t1.number_rayati,

};
dataGridView1.DataSource = query3;

حالا میخام نام افراد پرداخت نکرده رو سلکت کنم .ممنون میشم کمک کنید

Mahmoud.Afrad
جمعه 20 آذر 1394, 17:23 عصر
id_p همان آیدی کشاورز هست دیگه؟


var query = from farmer in db.tbl_farmers
where !(from daryafti in db.Tbl_dareyaftis
where farmer.number_farmer == daryafti.id_p
&& daryafti.date == dateTimeSelector1.GetText("yyyy/MM/dd")
select daryafti).Any()
select farmer;

//var query = db.tbl_farmers.Where(farmer => !db.Tbl_dareyaftis.Any(daryafti => farmer.number_farmer == daryafti.id_p) && daryafti.date == dateTimeSelector1.GetText("yyyy/MM/dd"));


اگر بین دو جدول رابطه ایجاد کردی به راحتی از طریق هر شئ از مدل tbl_farmer میتونی به دریافتی های هر کشاورز دسترسی داشته باشید

var query = from farmer in db.tbl_farmers
where !(from daryafti in farmer.Tbl_dareyaftis where daryafti.date == dateTimeSelector1.GetText("yyyy/MM/dd") select daryafti).Any()
select farmer;

vB.N3T
جمعه 20 آذر 1394, 20:02 عصر
ممنون اقای افراد با کد شما مشکل حل شد
تابع Any() میشه توضیح بدید چیکار میکنه
سرچ زدم چیز خاصی ب زبان فارسی در موردش نیامد
و علامت ! پشت پرانتز
ممنون

Mahmoud.Afrad
جمعه 20 آذر 1394, 21:46 عصر
متد Any بررسی میکنه آیا عنصری از مجموعه وجود داره که دارای شرط مورد نظر باشه(معادل Exists در sql) . در صورت پیدا کردن چنین عنصری دیگه بقیه عناصر رو چک نمیکنه و مقدار true برمیگردونه و در صورتی که تا پایان مجموعه عنصری با شرط مورد نظر پیدا نکنه false برمیگردونه.
https://msdn.microsoft.com/library/bb534972.aspx

! Operator عملگر منطقی هست که نقیض مقدار منطقی Bool(boolean) جلوی خودش رو محاسبه میکنه
https://msdn.microsoft.com/en-us/library/f2kd6eb2.aspx



شرط کوئری بررسی میکنه برای هر کشاورز آیا در تاریخ مورد نظر دریافتی ثبت شده یا نه. اگر ثبت نشده بود متد any مقدار false برمیگردونه و ! باعث میشه این مقدار False تبدیل به true بشه و شرط جلوی where برقرار میشه و اون کشاورز انتخاب میشه.


!Any(...) رو میشه نقیض کرد و با متد All نوشت. (در این صورت شرط متد هم نقیض میشه). عکسش رو هم میتونید(تبدیل All به Any به همراه نقیض شرط)
مثلا برای کوئری دوم، شرط رو میتونید به صورتی بررسی کنید که برای همه (All) دریافتی های یک کشاورز، تاریخ دریافتی مخالف تاریخ مورد نظر شما باشه (کلا منطق Any و All همون منطق بیان فارسی مسئله هست)

//...
where (from daryafti in farmer.Tbl_dareyaftis where daryafti.date != dateTimeSelector1.GetText("yyyy/MM/dd") select daryafti).All()
//...