LINQ查询应该基于标准
本文关键字:标准 于标准 查询 LINQ | 更新日期: 2023-09-27 18:11:45
这对我来说可能有点棘手,因为我是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
});
我建议尝试谓词生成器http://www.albahari.com/nutshell/predicatebuilder.aspx。
那篇文章建议如下:
试验PredicateBuilder最简单的方法是使用LINQPad。LINQPad允许您根据数据库或本地集合并直接支持PredicateBuilder(按F4)并检查'Include PredicateBuilder')。
是使用这种方法的一种简单方法。
希望对你有帮助。
一个解决方案是使用Dynamic 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