繁体   English   中英

LINQ查询应基于条件

[英]LINQ query should be based on criteria

这对我来说可能有点棘手,因为我刚接触LINQ。 我有以下LINQ代码可以正确返回我的数据。 但是,给出的条件是选择性的。 意思是,一次可能无法给出所有条件。条件是基于用户输入的。 因此,如何根据用户选择的标准编写此类增量LINQ。

        var dRows = (from TblPatientInformation in this.dsPrimaPlus1.tblPatientInformation
                    join TblDoctorMaster in this.dsPrimaPlus1.tblDoctorMaster on new { PtI_dcMId = Convert.ToInt32(TblPatientInformation.ptI_dcMId) } equals new { PtI_dcMId = TblDoctorMaster.dcM_Id }
                    join TblDepartmentMaster in this.dsPrimaPlus1.tblDepartmentMaster on new { DcM_deptMId = TblDoctorMaster.dcM_deptMId } equals new { DcM_deptMId = TblDepartmentMaster.ID }
                    join TblPatientDiagnosis in this.dsPrimaPlus1.tblPatientDiagnosis on new { PtI_Id = TblPatientInformation.ptI_Id } equals new { PtI_Id = Convert.ToInt32(TblPatientDiagnosis.ptD_ptIId) }
                    join TblDiagnosisInformation in this.dsPrimaPlus1.tblDiagnosisInformation on new { PtD_tgIId = Convert.ToInt32(TblPatientDiagnosis.ptD_tgIId) } equals new { PtD_tgIId = TblDiagnosisInformation.tgI_Id }
                    where
                      TblPatientInformation.ptI_Id > 0 ||
                      TblPatientInformation.ptI_PatientName.Contains(txtName.Text)  ||
                      TblPatientInformation.ptI_Code == int.Parse( txtCaseNo.Text) ||
                      TblDepartmentMaster.ID ==int.Parse( cmbDepartment.SelectedValue.ToString()) ||
                      TblDoctorMaster.dcM_Id == int.Parse(cmbDoctor.SelectedValue.ToString()) ||
                      TblDiagnosisInformation.tgI_Id == int.Parse(cmbDiagnosis.SelectedValue.ToString())
                    select new
                    {
                        TblPatientInformation.ptI_Id,
                        TblPatientInformation.ptI_Code,
                        TblPatientInformation.ptI_PatientName,
                        TblPatientInformation.ptI_dcMId,
                        TblPatientInformation.ptI_Age,
                        TblPatientInformation.ptI_Address,
                        TblPatientInformation.ptI_eMail,
                        TblPatientInformation.ptI_Phone1,
                        TblPatientInformation.ptI_Phone2,
                        TblPatientInformation.ptI_Phone3,
                        TblPatientInformation.ptI_Date,
                        TblPatientInformation.ptI_Gender,
                        TblDiagnosisInformation.tgI_Name,
                        TblDiagnosisInformation.tgI_Description,
                        TblDoctorMaster.dcM_FullName,
                        TblDepartmentMaster.Department
                    });

我建议为此尝试Predicate Builder http://www.albahari.com/nutshell/predicatebuilder.aspx

该帖子建议以下内容:

使用PredicateBuilder进行实验的最简单方法是使用LINQPad。 LINQPad允许您针对数据库或本地集合立即测试LINQ查询,并直接支持PredicateBuilder(按F4并选中“ Include PredicateBuilder”)。

这是采用这种方法的一种简单方法。

希望能有所帮助。

一种解决方案是使用动态LINQ,您可以在其中指定字符串表达式而不是代码表达式。 例如

// Dynamic Linq string expression
var result = context.People.Where("Age >= 3 And StreetNumber < 3").ToList();

相对于:

// Linq code expression
var result = context.People.Where(q=>q.Age>=3 && q.StreetNumber < 3).ToList();

这样,您可以根据用户输入来解析表达式,例如

StringBuilder sb = new StringBuilder();
...
if(criteria1)
{
  sb.Append(" And Criteria>1");
}
...
if(criteria2)
{
  sb.Append(" And Criteria2<15");
}
...
var result = context.People.Where(sb.ToString()).ToList();

请查看此Scott Gu文章,以获取完整示例:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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