【问题标题】:linq query join with multiple tables filtering not working带有多个表过滤的linq查询连接不起作用
【发布时间】:2011-09-15 11:23:10
【问题描述】:

我有一个包含四个文本框和两个组合框的表单...

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

为此我编写了以下代码

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 中输入 robin,则会显示姓氏为 robin 的详细信息...

我已经在数据库中检查了有姓罗宾的人.. 但它不会显示在数据网格视图中...

有没有人帮忙解决这个问题...

非常感谢提前....

【问题讨论】:

  • 你能问得更清楚点吗?我无法理解.....
  • 我认为 V4Vendetta 询问的是外壳 - 在您的比较中是上/下。
  • 我的意思是 "robin" =="robin" 但不是 "Robin" -- "robin"
  • 我还有一个关于会员类型的问题,我在 cbGEMembershiptype 中有会员类型。SelectedText 是黄金,在数据库中也是黄金,但它没有显示拥有黄金会员类型的会员

标签: c# .net winforms linq linq-to-entities


【解决方案1】:

您的问题是,您正在对所有字段进行 AND 比较。这意味着,只返回数据库中与所有输入数据匹配的条目!如果您只输入 robin 作为姓氏而不输入其他名称,您将不会得到任何结果,因为所有其他字段都不匹配。更改您的查询以仅包含那些非空字段。像这样的:

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

【讨论】:

  • 是否有任何其他选项可以获取详细信息...。我的意思是,如果我输入会员姓氏,则将显示会员详细信息,如果我在组合框中选择会员类型,则会员详细信息将为显示那些选择了会员类型的人..你能建议任何替代方案吗...
  • if(!string.IsNullOrEmpty(lastname)) memberreport = memberreport.Where(r => r.member_Lastname == lastname);我在这一行得到了错误 delegat 'system.fun' does not take 1 arguments..
  • 我无法像这样检查其他表中的所有字段..(if(!string.IsNullOrEmptry(membershipstatustypesa) query = query.Where(r => r. == memberstatustypesa); i不能这样检查..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多