PDA

View Full Version : ترکیب چند دستور در linq



nazi89
یک شنبه 29 دی 1392, 20:17 عصر
سلام من دوتا جدول دارم به اسم
tazmoon(id student, gozine entekhabi, id soal)
tsoal(…id soal, gozine dorost)
که میخوام اول روی tazmoon بر حسب idstudent یه groupby بزنم و مقادیرid student, gozine entekhabi و idsoal را select کنه بعد اینا را با جدول tsoal بر حسب id soal به هم join کنم واگر شرط gozinedorost ==gozine entekhabi درست بود شمارش گر i++ واگر نامساوی بود j++ و اگر gozine entekhabi برابر null بود به m++
به صورت linq بنویسم ممنون میشم اگه راهنماییم کنید
یا در یک کوئری چطور از نتیجه کوئری دیگر استفاده کنم

Hajivandian
یک شنبه 29 دی 1392, 22:35 عصر
سلام،


خوب این عمل چون ترکیبی است ، یعنی بیش از یک مورد است. باید به صورت Transactional بنویسی تا در صورت رخ دادن خطا کل عملیات Rolback بشه.

والا این اولین باره که میشنوم برا خوندن اطلاعات هم باید از تراکنش استفاده کرد! اونوقت در صورت خطا دقیقا چی باید رول بک بشه :) ، اطلاعات خونده شده!

مورد بعدی هم اینه که معمولا مواقع استفاده از لینک احتمالا داریم از ORM ان تی تی فریم ورک استفاده میکنیم؛ که در این صورت هم نیازی به استفاده از تراکنش نیست؛ چون در داخل متد SaveChange مربوط یه Context دیتابیس این عمل به صورت خودکار پیاده سازی میشه. یعنی در صورتی که تابع فوق را در انتهای کار فراخوانی کنیم در صورتی که تمام تغییرات اعمال نشود، عملیات رول بک خواهد شد. بر طبق گفته زیر:
SaveChanges operates within a transaction. SaveChanges will roll back that transaction and throw an exception if any of the dirty ObjectStateEntry objects cannot be persisted.
منبع: http://msdn.microsoft.com/en-us/library/bb336792(v=vs.110).aspx

rahnema1
دوشنبه 30 دی 1392, 00:02 صبح
سلام
ببینید اگه هدفتون بدست آوردن کل تعداد جواب های درست ، جواب های غلط و جواب های null هست این جور میشه البته دقت کنید در اینجا جواب های غلط شامل جواب های null هم میشه


var ijm=
from tso in tsoal
join taz in tazmoon on tso.id_soal equals taz.id_soal
select new {gozine_dorost=tso.gozine_dorost,gozine_entekhabi= taz.gozine_entekhabi};
int i = ijm.Where(zz=>zz.gozine_entekhabi==zz.gozine_dorost).Count();
int j = ijm.Where(zz=>zz.gozine_entekhabi!=zz.gozine_dorost).Count();
int m = ijm.Where(zz=>zz.gozine_entekhabi==null).Count();

nazi89
دوشنبه 30 دی 1392, 09:28 صبح
دوستان مرسی از از کمکتون
rahnema1 عزیز ولی این قسمت سوالم که روی tazmoon بر حسب idstudent یه groupby بزنم چی میشه ؟

rahnema1
دوشنبه 30 دی 1392, 12:57 عصر
اگه تعداد کل را می خواهید که group دیگه به چه درد می خوره؟

nazi89
دوشنبه 30 دی 1392, 16:01 عصر
ببین اینجوریه که یه دانشجو به هر چند تا سوال پاسخ داده به همون تعداد دفعه شمارش تو جدول ذخیره شده یعنی تو tazmoon چندین بار شمارش تکرا شده
نتیجه join که شما داده بودی اینجوریه که کل سولات را تصحیح میکنه ولی من میخوام بر حسب هر دانشجو تصحیح بشه یعنی اول group by بشن بعد تصحیح
من دنبالش که رفتم میشد یه کوئری group by زد و یک کوئری join بعد این دوتا کوئری را unoin کنیم ولی واسه من خطا میده .نمیدونم چی کارش کنم

nazi89
دوشنبه 30 دی 1392, 16:04 عصر
خوب این عمل چون ترکیبی است ، یعنی بیش از یک مورد است. باید به صورت Transactional بنویسی تا در صورت رخ دادن خطا کل عملیات Rolback بشه.

پیشنهاد می کنم از SqlTransactionاستفاده کن یا به صورت SP بنویس
موفق باشی
من بلد نیستم میشه کدش بگی ...ممنون

rahnema1
دوشنبه 30 دی 1392, 18:29 عصر
اگه تعداد را جدا جدا می خواهی اینجوری


var ijm=
(from tso in tsoal
join taz in tazmoon on tso.id_soal equals taz.id_soal
select new {id_student=taz.id_student,gozine_dorost=tso.gozin e_dorost,gozine_entekhabi=taz.gozine_entekhabi})
.GroupBy(zz=>zz.id_student)
.Select(zz=>new {
i=zz.Count(zz1=>zz1.gozine_entekhabi==zz1.gozine_dorost),
j=zz.Count(zz1=>zz1.gozine_entekhabi!=zz1.gozine_dorost && zz1.gozine_entekhabi!=null),
m=zz.Count(zz1=>zz1.gozine_entekhabi==null)});

nazi89
دوشنبه 30 دی 1392, 21:31 عصر
اگه تعداد را جدا جدا می خواهی اینجوری


var ijm=
(from tso in tsoal
join taz in tazmoon on tso.id_soal equals taz.id_soal
select new {id_student=taz.id_student,gozine_dorost=tso.gozin e_dorost,gozine_entekhabi=taz.gozine_entekhabi})
.GroupBy(zz=>zz.id_student)
.Select(zz=>new {
i=zz.Count(zz1=>zz1.gozine_entekhabi==zz1.gozine_dorost),
j=zz.Count(zz1=>zz1.gozine_entekhabi!=zz1.gozine_dorost && zz1.gozine_entekhabi!=null),
m=zz.Count(zz1=>zz1.gozine_entekhabi==null)});

مرسی به خدا خیلی کمک کردی
شرمنده حالا اگه تو select اخری شماره دانشجویی هم بده چطور میشه
مرسی

rahnema1
دوشنبه 30 دی 1392, 21:46 عصر
این که دیگه کاری نداره

var ijm=
(from tso in tsoal
join taz in tazmoon on tso.id_soal equals taz.id_soal
select new {id_student=taz.id_student,gozine_dorost=tso.gozin e_dorost,gozine_entekhabi=taz.gozine_entekhabi})
.GroupBy(zz=>zz.id_student)
.Select(zz=>new {
id=zz.Key,
i=zz.Count(zz1=>zz1.gozine_entekhabi==zz1.gozine_dorost),
j=zz.Count(zz1=>zz1.gozine_entekhabi!=zz1.gozine_dorost && zz1.gozine_entekhabi!=null),
m=zz.Count(zz1=>zz1.gozine_entekhabi==null)});

nazi89
دوشنبه 30 دی 1392, 22:53 عصر
مرسی گلم
اخه من یه پروژه داشتم که استاد مجبور کرده به C#‎ بنویسم .یه هفته از شروع کردم که الان تموم شد به کمک تو البته به خاطر همین زیاد بلد نیستم