简体   繁体   English

LINQ查询应基于条件

[英]LINQ query should be based on criteria

This might be bit tricky here for me, as I am new to LINQ. 这对我来说可能有点棘手,因为我刚接触LINQ。 I have following LINQ code returns me data properly. 我有以下LINQ代码可以正确返回我的数据。 But, the conditions given are selective. 但是,给出的条件是选择性的。 Means, all the conditions may or may not be given at a time.Conditions are user input based. 意思是,一次可能无法给出所有条件。条件是基于用户输入的。 So, how to write such incremental LINQ based on criteria selected by user. 因此,如何根据用户选择的标准编写此类增量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
                    });

I recommend trying out Predicate Builder http://www.albahari.com/nutshell/predicatebuilder.aspx for this purpose. 我建议为此尝试Predicate Builder http://www.albahari.com/nutshell/predicatebuilder.aspx

That post recommends the following: 该帖子建议以下内容:

The easiest way to experiment with PredicateBuilder is with LINQPad. 使用PredicateBuilder进行实验的最简单方法是使用LINQPad。 LINQPad lets you instantly test LINQ queries against a database or local collection and has direct support for PredicateBuilder (press F4 and check 'Include PredicateBuilder'). LINQPad允许您针对数据库或本地集合立即测试LINQ查询,并直接支持PredicateBuilder(按F4并选中“ Include PredicateBuilder”)。

which is an easy way to get going with this approach. 这是采用这种方法的一种简单方法。

Hope that helps. 希望能有所帮助。

One solution would be to use Dynamic LINQ, where you can specify string expressions, instead of code expressions. 一种解决方案是使用动态LINQ,您可以在其中指定字符串表达式而不是代码表达式。 eg 例如

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

as opposed to: 相对于:

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

With this, you can parse your expression based on the user input, eg 这样,您可以根据用户输入来解析表达式,例如

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();

Check out this Scott Gu article for a complete example: 请查看此Scott Gu文章,以获取完整示例:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx 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