带参数的linq查询,可以为空

时间:2009-10-26 12:58:51

标签: c# asp.net linq

我在db中有两个重要的日期字段。

startTime和goTime

我想创建自定义查询,其中一个参数可能为空,请参阅我的示例

public List<Type> GetAll( DateTime startTime, DateTime goTime )
{
List<Type> getResultBetween =

   (from i in DB.TABLENAME
    where i.startTime >= startTime && i.goTime == ANYTHING
    select i).ToList();
    return getResultBetween;
}

现在的目标是,即使没有定义goTime,我仍然可以达到给定的startTime。 如果我定义goTime并让Starttime为空,它也应该工作。雷索应该给我所有人,直到上午。

谢谢

4 个答案:

答案 0 :(得分:9)

尝试这样的事情,使用可空类型并明确构建查询:

public List<Type> GetAll(DateTime? startTime, DateTime? goTime )
{
    IQueryable<Type> query = DB.TABLENAME;
    if (startTime != null)
    {
        query = query.Where(i => i.startTime >= startTime.Value);
    }
    if (goTime != null)
    {
        query = query.Where(i => i.goTime == goTime.Value);
    }
    return query.ToList();
}

答案 1 :(得分:2)

试试这个“hacked”where子句:

where (i.startTime >= (startTime ?? i.startTime)) && (i.goTime >= (goTime ?? i.goTime))

为此,startTime和goTime应为Nullable&lt; DateTime&gt; (或DateTime?)。

这适用于所有情况,即......时......

  1. 其中一个参数为空
  2. 两者都为空
  3. 两者都不为空

答案 2 :(得分:0)

奇怪它不起作用。欲获得更多信息。这是一个网络服务,但我希望这不是问题。

我的方法看起来像。

public List<FDPGeschaefte> AlleGeschaefteZwischenBestimmtemDatum(string StartDatum, string EndDatum)
{
    IQueryable<FDPGeschaefte> query = DB.FDPGeschaefte;
    if (StartDatum != null && EndDatum != null)
    {
        query = query.Where(i => i.SysCreated > DateTime.Parse(StartDatum) && i.SysCreated <= DateTime.Parse(EndDatum));
    }
    if (StartDatum != null)
    {
        query = query.Where(i => i.SysCreated >= DateTime.Parse(StartDatum));
    }
    if (EndDatum != null)
    {
        query = query.Where(i => i.SysCreated <= DateTime.Parse(EndDatum));
    }
    return query.ToList();
}

如果我在webservice中只键入一个参数。它会抛出一个无效的datetime参数。

答案 3 :(得分:0)

你好,你可以尝试这样的事情。

public static List<Type> GetAll(DateTime? startTime, DateTime? goTime)
    {
        List<Type> getResultBetween =
            (from i in DB.TableName
             where (startTime.HasValue && i.StartTime >= startTime)
                   || (goTime.HasValue && i.GoTime >= goTime)
             select i).ToList();
        return getResultBetween;
    }