【问题标题】:Only include in where condition if date is not low date(01/01/0001)如果日期不是低日期,则仅包含在 where 条件中(01/01/0001)
【发布时间】:2019-11-07 17:41:06
【问题描述】:

我有一个查询,它有一个 where 条件来检查和查找在某个日期之后添加的地址。日期字段不是必需的,因此我希望仅在不是 1/1/0001 时才考虑条件的日期字段。 dtmDate 是正在传递的参数

查询

from b in _context.customer
           join d in _context.Address on b.id equals d.Id 
           join e in _context.units on d.Id equals e.Id
           where (req.dtmDate.Year != 1 && d.DateAdded >= req.dtmDate)

select new modelAddress
              {
               address= d.address
              }

但这不起作用。它没有返回任何行

【问题讨论】:

  • req 定义在哪里?
  • @JuanCarlosOropeza 这是一个具有属性 dtmDate 的模型,该属性正在此函数中传递
  • 很可能是因为req.dtmDate 设置为默认值,而您的where 子句指定只有在req.dtmDate.Year != 1 时才返回记录。

标签: c# sql .net sql-server linq


【解决方案1】:

我会利用在您编写 LINQ 查询时不执行它们的事实,因此您可以在创建基本查询后有条件地添加子句:

var query = from b in _context.customer
       join d in _context.Address on b.id equals d.Id 
       join e in _context.units on d.Id equals e.Id;

if(req.dtmDate.Year != 1)
  query = query.Where(d.DateAdded >= req.dtmDate);

var result = query.Select(
  new modelAddress
  {
    address= d.address
  }
);

我更喜欢这个,因为我以前遇到过问题,特别是在 EF LINQ 查询中,当 Where 子句包含在代码中本地评估为 true 的内容时,而不是数据库将评估的内容。当“通配符”数据库查询时,使用“如果 x 为真,则添加另一个-where-clause”而不是说“where(local-value-of-x-equals-local-) 似乎效果更好常量 OR some-db-data-value-equals-y)"

【讨论】:

  • 这确实是一种更好的方法,并且出于同样的原因。由于使用了 Rufus 提到的方法,我有很多查询失控(查询计划缓存不佳)。您的方法将根据 dtmDate 是否应被视为查询的一部分生成不同的查询(因此产生不同的查询计划),并且将始终为每个查询使用最佳查询计划。
【解决方案2】:

如果我理解正确,您有一个名为 req.dtmDateDateTime 对象,该对象可能设置为默认值,并且您希望返回该项目的 DateAdded 字段大于 req.dtmDate 的所有项目,除非req.dtmDate1/1/0001,在这种情况下应该返回所有记录。

如果是这样,我认为您可以将现有代码修改为:

where (req.dtmDate.Year == 1 || d.DateAdded >= req.dtmDate)

【讨论】:

  • req.dtmDate == DateTime.MinValue 而不是 req.dtmDate.Year == 1 怎么样?
  • 另外,你应该在查询之前检查req.dtmDate.Year != 1。不应该是WHERE的一部分
猜你喜欢
  • 1970-01-01
  • 2018-12-06
  • 2015-12-31
  • 1970-01-01
  • 2021-04-23
  • 2021-01-28
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
相关资源
最近更新 更多