2011-09-15 32 views
0

我有四个文本框和两个组合框形式...LINQ查询联接多个表过滤不工作

我正在过滤数据和数据网格视图中显示的数据时选择的组合框和文本取决于键入的文本框..

为我写了下面的代码

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; 
} 

,这是我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; 
    } 

如果我在txtlastname键入罗宾的详细信息将显示whoose姓是罗宾......

我在数据库中检查了存在的人与姓氏罗宾.. 但它并不在数据网格视图中显示...

将任何人请在此帮助...

很多感谢....

+0

它们是否在同一个案例中? – V4Vendetta

+0

你会更清楚地问一下吗?我无法理解..... –

+0

我认为V4Vendetta在询问有关外壳的问题 - 比较中的上限/下限。 –

回答

0

你的问题是,你正在做的在各个领域的和比较。这意味着,只有来自数据库的条目才会被返回,匹配所有输入的数据!如果您只输入罗宾名作为姓,而没有其他名称,则不会得到结果,因为所有其他字段都不匹配。将您的查询更改为仅包含那些非空的字段。类似这样的:

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 
+0

是否有任何其他选项来获取详细信息....我的意思是,如果我输入会员的姓氏会员detials将显示,如果我选择成员类型的组合会员detials将被显示那些谁选择了会员类型..你会请建议任何替代... –

+0

@ errorror:请参阅更新的答案。 –

+0

if(!string.IsNullOrEmpty(lastname)) memberreport = memberreport.Where(r => r.member_Lastname == lastname);我得到了这条线的错误委托'system.fun '不需要1个参数.. –