دسته بندی ها
12:25 1399/07/19

ایجاد جستجوی ترکیبی بین چند فیلد در سی شارپ

مشخصات سوال کننده :
کاربر : Piman_b     امتیاز کاربر : ‎−7     رتبه کاربر : 7097
دسته بندی : سی شارپ

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 4475
پاسخ دهنده : hamid_b 15:21 1399/07/19

ایجاد جستجوی ترکیبی در سی شارپ

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

خب شما اگر میخواید بین استان، شهرستان و نمرات دانش آموزان از تاریخ تا تاریخ جستجو انجام بدید اول باید یک کوئری رو بنویسید که شامل همه این فیلدها باشه. ممکنه نیاز داشته باشید که Join انجام بدید بین جداولتون.

در کوئری زیر فرض کردیم که 4 جدول داریم :

  • جدول CityTbl : شامل لیست شهرها
  • جدول ProvienceTbl : شامل لیست استانها
  • جدول StudentTbl : شامل لیست دانش آموران
  • جدول ScoreTbl : شامل لیست نمرات و تاریخ آنها

 

 public List<StudentViewModel> StudentList(int ProvienceID, int CityID, DateTime fromdate, DateTime todate)
        {
            var Query = (from s in _context.StudentTbl
                                join sc in _context.ScoreTbl on s.studentId equals sc.studentId
                                join p in _context.ProvienceTbl on s.studentId equals p.studentId 
                                join c in _context.CityTbl on p.provienceid equals c.provienceid
                                where SL.userId_reciever == userId_reciever
                                select new StudentViewModel()
                                {
                                    cityName = c.CityName,
                                    cityid = c.cityid,
                                    provienceName = p.provienceName,
                                    provienceid = p.provienceid,
                                    studentName = s.studentName,
                                    studentid = s.studentid,
                                    score = sc.score,
                                    scoreDate = sc.scoreDate
                                }).AsEnumerable();
}

خب در بالا 4 جدول لا هم جوین شدن و نتیجه اونها در یک ViewModel به نام StudentViewModel ذخیره شده. بنابراین شما نیاز دارید که یک ویومدل با این نام و با فیلدهایی که در کوئری بالا استفاده شده هم داشته باشید:

public class StudentViewModel
{
  public string cityName {get; set;}
  public int cityid {get; set;}
  public string provienceName {get; set;}
  public int provienceid {get; set;}
  public string studentName {get; set;}
  public int studentid {get; set;}
  public int score {get; set;}
  public DateTime scoreDate {get; set;}
}

 

پس تا اینجای کار هم کوئری رو داریم که با انتیتی فریم ورک نوشته شده و هم ویومدل را داریم. خب حالا به راحتی میتونیم در نتیجه کوئری جستجو انجام بدیم. در واقع باید جستجو را دقیقا در همان تابع StudentList بنویسیم. بنابراین تابع ما در نهایت به صورت زیر تبدیل می شود.

 public List<StudentViewModel> StudentList(int ProvienceID, int CityID, DateTime fromdate, DateTime todate)
        {
            var Query = (from s in _context.StudentTbl
                                join sc in _context.ScoreTbl on s.studentId equals sc.studentId
                                join p in _context.ProvienceTbl on s.studentId equals p.studentId 
                                join c in _context.CityTbl on p.provienceid equals c.provienceid
                                where SL.userId_reciever == userId_reciever
                                select new StudentViewModel()
                                {
                                    cityName = c.CityName,
                                    cityid = c.cityid,
                                    provienceName = p.provienceName,
                                    provienceid = p.provienceid,
                                    studentName = s.studentName,
                                    studentid = s.studentid,
                                    score = sc.score,
                                    scoreDate = sc.scoreDate
                                }).AsEnumerable();

         if (CityID != 0)
         {
            Query = Query.where(q => q.CityID == CityID);
         }
         if (ProvienceID != 0)
         {
            Query = Query.where(q => q.ProvienceID == ProvienceID );
         }
         if (fromdate != null)
         {
            Query = Query.Where(q => q.scoreDate.Date >= fromdate);
         }
         if (todate != null)
         {
            Query = Query.Where(q => q.scoreDate.Date <= todate);
         }

         return Query.ToList();
            
}

 

در نهایت بعد از فیلتر اطلاعات خروجی در return تابع برگشت داده می شود.

به این پاسخ امتیاز بدهید    2
امتیاز: 510 رتبه: 4
پاسخ دهنده : Piman_b 09:33 1399/07/20

سلام دوست عزیز ممنون که وقت گذاشتی و جواب دادید...

من چند بار امتحان کردم نشد.. یعنی من زیاد مسلط نیستم توضیحات شما کامله..

اگه ممکنه ایمیل بزارید که من پروژه بفرستم خدمتتون و هزینش هم پرداخت میکنم هر چی حق شما باشه.

ویرایش شده در یکشنبه 20 مهر 1399 ساعت 14:17:32
به این پاسخ امتیاز بدهید    0
امتیاز: ‎−7 رتبه: 7097
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود