Linq to SQL问题用where子句

时间:2016-02-09 14:34:36

标签: c# linq-to-sql

我正在尝试使用以下逻辑在Linq to SQL中创建where子句

如果@supplierid为null则返回所有记录。

如果@supplierid不为null返回,其中supplierid等于@supplierid。

和正在创建问题的那个:

如果@supplierid == 0则返回supplierid为null的所有记录

我试着写这个像

var answers =
            from thisChargeableService in this.GetAll()
            where
            (
                (
                    (supplierId == null) ||
                    (
                        ((supplierId < 1) && (thisChargeableService.SupplierId == null)) ||
                        ((supplierId != null) && (thisChargeableService.SupplierId == supplierId.Value))
                    )
                ));

这适用于前两个条件,但是当@supplierid = 0时,不返回任何内容。

非常感谢任何帮助

修改

基本上我有一个ID为0的N / A下拉列表。我用它来识别从下拉列表中选择了一个选项,并且用户的目标是供应商ID为N / A的所有行。

数据库不包含0作为supplierid的条目,所以我试图将其作为目标,其中supplierid为null或SQL中的以下

    SELECT * FROM ChargeableService
WHERE 
(@supplierid is null)
OR
(
(@supplierid is not null and supplierid = @supplierid) or
(@supplierid = 0 AND supplierid is null)
)

2 个答案:

答案 0 :(得分:0)

我已经采取了您的查询并针对一些类似的数据运行它,以下工作:

var answers =
        from thisChargeableService in this.GetAll()
        where
        (
            supplierId == null ||
            (supplierId == 0 && thisChargeableService.SupplierId == null) ||
            (supplierId > 0 && thisChargeableService.SupplierId == supplierId)
        )
        select thisChargeableService;

答案 1 :(得分:0)

使用Linq,没有必要尝试构建一个查询来完成所有操作。相反,你可以在buts中构建表达式,让延迟执行构建并执行正确的sql。

所以,这就是我的方式。

  var answers =  this.GetAll().AsQueryable();

  if (supplierId.HasValue && (supplierId.Value != 0))
     answers = answers.Where(a=>a.SupplierId == supplierId.Value);

  if (supplierId.HasValue && (supplierId.Value == 0))
     answers = answers.Where(a=>!a.SupplierId.HasValue);