PDA

View Full Version : سوال: راهنمایی در نوشتن query از 2 جدول در بازه ای از تاریخ توسط linq



vB.N3T
پنج شنبه 24 تیر 1395, 18:42 عصر
سلام مهندسین عزیز

من 2 تا جدول دارم یکی جدول افرد که اطلاعات شخصی ذخیره داره
و یکی جدول پرداختی ها که اطلاعات پرداختی ها رو نگه میداره
این 2 جدول با هم در ارتباط هستن

حالا نیاز پیدا کردم که لیست افرادی که بین 2 تاریخ پرداخت انجام ندادن در بیارم
یه کمبو باکس گذاشتم که تاریخ رو انتخاب میکنم و لیست افراد که پرداخت در اون ماه انجام ندادن در اوردم (کد پاین)
اما فقط تو یک تاریخی که از کمبو باکس انتخاب کردم رو نمایش میده
برای نوشتن query که با 2 کمبو باکس و بین 2 بازه زمانی جستجو انجام بده باید کدمو چه تغیری بدم ممنون

var query = from farmer in db.Tbl_Sabt_Farmers
where !(from daryafti in db.Tbl_dareyafti2s
where farmer.number_farmer == daryafti.id_p
&& daryafti.date == como_date.Text
select daryafti).Any()
select new { farmer.Name };

ژیار رحیمی
پنج شنبه 24 تیر 1395, 23:14 عصر
دوست گرامی query چون لیست اسامی افرادی که پرداختی نداشته اند میخوای بدست بیاری ابتدا لیست اسامی اشخاصی که در بازه مشخص شده پرداختی داشته اند و بدست بیار و لیست جاری رو از لیست کلی اشخاص کم کن نتیجه لیست اشخاصی که پرداختی در بازه مشخص انجام ندادن بدست میاد.نحوه بدست آوردن اسامی غیر مشترک بین دو لیست میتونی بصورت زیر بدست بیاری

var differenceQuery =
CustomerTotalList.Except(QueryCusomerList);

golbafan
جمعه 25 تیر 1395, 01:37 صبح
وقتی میخواهید در یک بازه زمانی جستجو کنید باید اینطور عمل کنید

فیلدتاریخ >= شروع
و
فیلدتاریخ <= پایان

درحالی که شما نوشتید:
daryafti.date == como_date.Text


var query = from farmer in db.Tbl_Sabt_Farmers
where !(from daryafti in db.Tbl_dareyafti2s
where farmer.number_farmer == daryafti.id_p
&& daryafti.date >= como_date1.Text
&& daryafti.date <= como_date2.Text
select daryafti).Any()
select new { farmer.Name };

vB.N3T
جمعه 25 تیر 1395, 15:50 عصر
وقتی میخواهید در یک بازه زمانی جستجو کنید باید اینطور عمل کنید

فیلدتاریخ >= شروع
و
فیلدتاریخ <= پایان

درحالی که شما نوشتید:
daryafti.date == como_date.Text


var query = from farmer in db.Tbl_Sabt_Farmers
where !(from daryafti in db.Tbl_dareyafti2s
where farmer.number_farmer == daryafti.id_p
&& daryafti.date >= como_date1.Text
&& daryafti.date <= como_date2.Text
select daryafti).Any()
select new { farmer.Name };


این خطا رو میده

Error 405 Operator '<=' cannot be applied to operands of type 'string' and 'string'

vB.N3T
جمعه 25 تیر 1395, 15:53 عصر
دوست گرامی query چون لیست اسامی افرادی که پرداختی نداشته اند میخوای بدست بیاری ابتدا لیست اسامی اشخاصی که در بازه مشخص شده پرداختی داشته اند و بدست بیار و لیست جاری رو از لیست کلی اشخاص کم کن نتیجه لیست اشخاصی که پرداختی در بازه مشخص انجام ندادن بدست میاد.نحوه بدست آوردن اسامی غیر مشترک بین دو لیست میتونی بصورت زیر بدست بیاری

var differenceQuery =
CustomerTotalList.Except(QueryCusomerList);


این لیست افرادی که در یه بازه زمانی پرداخت انجام دادن .جطور باید از لیست کلی اشخاص کمشون کنم ؟؟

var q = from t1 in db.Tbl_Sabt_Farmers
join t2 in db.Tbl_dareyafti2s
on t1.number_farmer equals t2.id_p
where
string.Compare(t2.date, combo_date.Text) >= 0
&&
string.Compare(t2.date, comboBox1.Text) <= 0
select new
{
NameProdect = t1.Name,
mablagh = t2.price,
datee = t2.date,
vaziat = t2.vaziyat,
};
dataGridView1.DataSource = q;

ژیار رحیمی
جمعه 25 تیر 1395, 17:59 عصر
var CustomerTotalList = { 1, 2, 3, 4, 6, 8 };
var QueryCusomerListPaied = { 3,8 };


var LstNotPaied = CustomerTotalList.Except(QueryCusomerListPaied);


foreach (var number in LstNotPaied)
Console.WriteLine(number);


/*
This code produces the following output:


1
2
4
6
*/

vB.N3T
جمعه 25 تیر 1395, 18:13 عصر
با این روش نتونستم انجامش بدم خطا داشت !
این کوئری رو نوشتم ولی یک ماه انتخاب شده از کمبو رو نشون میده .بازه روش اعمال نمیشه !!


var query = from farmer in db.Tbl_Sabt_Farmers
where !(from daryafti in db.Tbl_dareyafti2s
where farmer.number_farmer == daryafti.id_p
&& string.Compare(daryafti.date, como_date.Text) >= 0
&& string.Compare(daryafti.date, comboBox1.Text) <= 0
select daryafti).Any()
select new { farmer.Name };

ژیار رحیمی
جمعه 25 تیر 1395, 21:37 عصر
تصویر دو جدول Tbl_Sabt_Farmerو Tbl_dareyafti2 رو بزار تا با توجه به آن کویری نوشته شود

golbafan
شنبه 26 تیر 1395, 00:08 صبح
این خطا رو میده

Error 405 Operator '<=' cannot be applied to operands of type 'string' and 'string'

شما تاریخ رو بصورت متن در نظر میگیرید و خطا میده

متن رو نمیتونید اینجوری مقایسه کنسد باید همون متغیر از نوع تاریخ رو مقایسه کنید
برای این کار اول متن رو به عدد تبدیل کنید و سپس اعداد رو مقایسه کنید

یا میتونید تاریخ رو به عدد تبدیل کنید:
برای مثال 1395/05/14 میشه عدد 13950514 بعد میتونی از اپراتورهای <= و >= استفاده کنی

vB.N3T
شنبه 26 تیر 1395, 00:11 صبح
Tbl_Sabt_Farmer


141486


Tbl_dareyafti2
141487


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


select * from Tbl_Sabt_Farmer where
Tbl_Sabt_Farmer.number_farmer not in (select Tbl_dareyafti2.id_p from Tbl_dareyafti2 where date='1395/04/26' or date='1395/06/01')


این کد سی شارپش هرچی نگاه میکنم درسته ولی تو خروجی فقط شرط and اول رو برقرار میکنه

var query = from farmer in db.Tbl_Sabt_Farmers
where !(from daryafti in db.Tbl_dareyafti2s
where farmer.number_farmer == daryafti.id_p
&& string.Compare(daryafti.date, como_date.Text) >= 0
&& string.Compare(daryafti.date, comboBox1.Text) <= 0
select daryafti).Any()
select new { farmer.Name };

vB.N3T
شنبه 26 تیر 1395, 00:12 صبح
شما تاریخ رو بصورت متن در نظر میگیرید و خطا میده

متن رو نمیتونید اینجوری مقایسه کنسد باید همون متغیر از نوع تاریخ رو مقایسه کنید
برای این کار اول متن رو به عدد تبدیل کنید و سپس اعداد رو مقایسه کنید

یا میتونید تاریخ رو به عدد تبدیل کنید:
برای مثال 1395/05/14 میشه عدد 13950514 بعد میتونی از اپراتورهای <= و >= استفاده کنی

اگر میشه با پست بالا کمک بدید.

ژیار رحیمی
شنبه 26 تیر 1395, 15:24 عصر
مشکل از مقایسه تاریخ نیست کویری رو بصورت زیر اصلاح کن ببین به نتیجه میرسی

var query = from farmer in db.Tbl_Sabt_Farmers
where !(from daryafti in db.Tbl_dareyafti2s
where farmer.number_farmer == daryafti.id_p
&& daryafti.date.Compare(como_date.Text) >= 0
&& daryafti.date.Compare(comboBox1.Text) <= 0
select daryafti.id_p).Contains(farmer.number_farmer)
select new { farmer.Name };

vB.N3T
یک شنبه 27 تیر 1395, 13:24 عصر
میشه این query جوری نوشت که علاوه بر نام از جدول farmer
تاریخ ک پرداخت نکرده هم بده ؟! امکانش هست اینطوری نوشتش؟

golbafan
چهارشنبه 30 تیر 1395, 13:04 عصر
اگر میخوای بین دو تاریخ رو جستجو کنی نباید بنویسی

where date='1395/04/26' or date='1395/06/01'

چون اینجوری داری میگی تاریخ یکی از این دو تا باشه


برای بینشون باید بنویسی

where date between '1395/04/26' and '1395/06/01'





این کد سی شارپش هرچی نگاه میکنم درسته ولی تو خروجی فقط شرط and اول رو برقرار میکنه

var query = from farmer in db.Tbl_Sabt_Farmers
where !(from daryafti in db.Tbl_dareyafti2s
where farmer.number_farmer == daryafti.id_p
&& string.Compare(daryafti.date, como_date.Text) >= 0
&& string.Compare(daryafti.date, comboBox1.Text) <= 0
select daryafti).Any()
select new { farmer.Name };

تغییر بده به این

var query = from farmer in db.Tbl_Sabt_Farmers
where !(from daryafti in db.Tbl_dareyafti2s
where (farmer.number_farmer == daryafti.id_p)
&& (string.Compare(daryafti.date, como_date.Text) >= 0)
&& (string.Compare(daryafti.date, comboBox1.Text) <= 0)
select daryafti).Any()
select new { farmer.Name };