简体   繁体   中英

linq query join with multiple tables filtering not working

I have a form with four text boxes and two comboboxes ...

i am filtering the data and displaying the data in datagrid view depends upon the selection in combobox and text typed in textboxes ..

for that i have written the below code

private void btnRunreports_Click(object sender, EventArgs e)
{
    int agefrom = Convert.ToInt32(cbGEFrom.Text);
    int ageto = Convert.ToInt32(cbGETo.Text);
    DateTime today = DateTime.Today;
    DateTime max = today.AddYears(-(agefrom + 1));
    DateTime min = today.AddYears(-(ageto));

    string maximum = Convert.ToString(max);
    string minimum = Convert.ToString(min);

    string gender = "";
    gender = Classes.reportmembers.ConvertGender(cbGEGendertype.Text);
    var mems = Classes.reportmembers
                      .getallreportmembers(gender,
                                           cbGEMembershiptype.SelectedText,
                                           txtlastname.Text,
                                           txtpostcode.Text,
                                           txtcardnum.Text,
                                           txtreference.Text,
                                           cbGEStatustype.SelectedText,
                                           maximum, minimum);
    BindingSource bs = new BindingSource();
    bs.DataSource = mems;
    dgvReportMembers.DataSource = bs;
}

and this is my class reportmembers :

class ReportMebers
{
    public int MemberID { get; set; }
    public string Lastname { get; set; }
    public string Firstname { get; set; }
    public string Postcode { get; set; }
    public string Reference { get; set; }
    public string CardNum { get; set; }
    public string IsBiometric { get; set; }
    public string DOB { get; set; }
    public string MShipType { get; set; }
    public string StatusType { get; set; }
    public string EndDate { get; set; }
}

 class reportmembers
 {
     public static List<ReportMebers> getallreportmembers(string gender, string membershiptype, string lastname,
                                                    string postcode,string cardnum,string refernce,
                                                      string membershipstatustypesa, string maxage, string minage)
     {

         //CultureInfo provider = CultureInfo.InvariantCulture;
         EclipseEntities eclipse = new EclipseEntities();
        List<ReportMebers> reporall = new List<ReportMebers>();
         var memberreport = from report in eclipse.members
                            join memtomship in eclipse.membertomships on report.member_Id equals memtomship.member_Id
                            join mshoption in eclipse.mshipoptions on memtomship.mshipOption_Id equals mshoption.mshipOption_Id
                            join membershiptypes in eclipse.mshiptypes on mshoption.mshipType_Id equals membershiptypes.mshipType_Id
                            join membershipstatustypes in eclipse.mshipstatustypes on memtomship.mshipStatusType_Id equals membershipstatustypes.mshipStatusType_Id                              
                            where  report.member_Lastname.Equals(lastname)
                            && report.member_CardNum.Equals(cardnum)
                            && report.member_Postcode.Equals(postcode)
                            && report.member_Reference.Equals(refernce)
                            && report.member_Gender.Equals(gender)
                            && membershiptypes.mshipType_Name.Equals(membershiptype)
                            && membershipstatustypes.mshipStatusType_Name.Equals(membershipstatustypesa)
                            && string.Compare(report.member_Dob,maxage) >= 0
                            && string.Compare(report.member_Dob, minage)< 0
                            select new
                            {
                                report.member_Id,
                                report.member_Lastname,
                                report.member_Firstname,
                                report.member_Postcode,
                                report.member_Reference,
                                report.member_CardNum,
                                report.member_IsBiometric,
                                report.member_Dob,
                                membershiptypes.mshipType_Name,
                                membershipstatustypes.mshipStatusType_Name,
                                memtomship.memberToMship_EndDate
                            };
         try
         {
             foreach (var membe in memberreport)
             {

                 ReportMebers allmembersrepor = new ReportMebers();
                 allmembersrepor.MemberID = membe.member_Id;
                 allmembersrepor.Lastname = membe.member_Lastname;
                 allmembersrepor.Firstname = membe.member_Firstname;
                 allmembersrepor.Postcode = membe.member_Postcode;
                 allmembersrepor.Reference = membe.member_Reference;
                 allmembersrepor.CardNum = membe.member_CardNum;
                 allmembersrepor.IsBiometric = membe.member_IsBiometric;
                 allmembersrepor.DOB = membe.member_Dob;
                 allmembersrepor.MShipType = membe.mshipType_Name;
                 allmembersrepor.StatusType = membe.mshipStatusType_Name;
                 allmembersrepor.EndDate = membe.memberToMship_EndDate;
                 reporall.Add(allmembersrepor);

             }
         }
         catch (Exception ex)
         {

             MessageBox.Show(ex.Message);

         }
         return reporall;
     }

if i type robin in txtlastname the details will be displayed whoose last name is robin...

i have checked in database there is person with last name robin.. but it does not displayed in datagrid view...

would any guys pls help on this...

Many thanks In advance....

Your problem is, that you are doing an AND comparison over all fields. That means, only entries from the database are returned, that match ALL entered data! If you only enter robin as last name and nothing else, you will get no results, because all the other fields aren't matching. Change your query to include only those fields that are not empty. Something like this:

var query = from report in eclipse.members
            join memtomship in eclipse.membertomships on report.member_Id equals memtomship.member_Id
            join mshoption in eclipse.mshipoptions on memtomship.mshipOption_Id equals mshoption.mshipOption_Id
            join membershiptypes in eclipse.mshiptypes on mshoption.mshipType_Id equals membershiptypes.mshipType_Id
            join membershipstatustypes in eclipse.mshipstatustypes on memtomship.mshipStatusType_Id equals membershipstatustypes.mshipStatusType_Id;

if(!string.IsNullOrEmpty(lastname))
    query = query.Where(r => r.member_Lastname == lastname);
if(!string.IsNullOrEmptry(cardnum)
    query = query.Where(r => r.member_CardNum == cardnum);
// and so on for all parameters

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM