1

我有以下 LINQ 语句,它wheredateLabID.

我正在传递一个 LABS 列表和一个日期,但它们不是必需的,我可能只传递一个日期,而不是实验室,在这种情况下,我想获得该特定实验室的所有实验室的结果.

这是我现在所拥有的:

List<dExp> lstDatExp = (from l in ctx.dExp.Include("datLab")
                        where values.Contains(l.datL.Lab_ID)
                            && l.reportingPeriod == reportingPeriod
                        select l).ToList<dExp>();

但是,如果传入的值不存在,则会中断。如何更改它以确保我的两个where语句都是可选的?

4

4 回答 4

5

使用 IQueryable,您可以简单地按步骤添加条件:

int? reportingPeriod = ...;

IQueryable<dExp> resultsQuery =         // don't use `var` here.
        ctx.dExp.Include("datLab");   

if (values != null)
   resultsQuery = resultsQuery.Where(exp => values.Contains(exp.datL.Lab_ID));

if (reportingPeriod.Hasvalue)
   resultsQuery = resultsQuery.Where(exp => exp.reportingPeriod == reportingPeriod.Value);

// additional .Where(), .OrderBy(), .Take(), .Skip() and .Select()

// The SQL query is made and executed on the line below
// inspect the string value in the debugger
List<dExp> results = resultsQuery.ToList();
于 2013-10-11T14:46:59.957 回答
3

这里有两种方法可以做到这一点。

但首先,请不要使用单个小写 l 作为标识符。将它与数字 1 混淆太容易了。更一般地说,stp 在 yr cde 中使用缩写,它将 hrdr 转换为 rd。

第一种技术:

var query = from lab in ctx.dExp.Include("datLab")
            where values == null || values.Contains(lab.datL.Lab_ID)
            where reportingPeriod == null || lab.reportingPeriod == reportingPeriod
            select lab;
var list = query.ToList<dExp>();

第二种技术:

IEnumerable<dExp> query = ctx.dExp.Include("datLab");
if (values != null)
    query = query.Where(lab=>values.Contains(lab.datL.Lab_ID));
if (reportingPeriod != null)
    query = query.Where(lab=>lab.reportingPeriod == reportingPeriod);
var list = query.ToList<dExp>();
于 2013-10-11T14:50:04.803 回答
2

我们所做的类似于 (l.reportingPeriod == reportingPeriod || reportingPeriod == null) 所以你检查参数是否是它的默认值,意思是它没有被使用,或者是否有东西在数据库中检查它。

于 2013-10-11T14:40:22.167 回答
1

您需要在执行查询之前检查您的值是否为空,如果是,请不要执行额外条件。

List<dExp> lstDatExp = 
    (from l in ctx.dExp.Include("datLab")
     where 
         (values == null || values.Contains(l.datL.Lab_ID)) &&
         (reportingPeriod == null || l.reportingPeriod == reportingPeriod)
     select l).ToList<dExp>();

这样,如果valuesorreportingPeriod为 null,它们本质上是可选的。

于 2013-10-11T14:45:33.127 回答