2009-10-26 3 views
1

У меня есть 2 важных поля даты в db.запрос linq с параметром, который может быть пустым

начальное время и 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; 
} 

Так цель теперь, что я получаю все до данного STARTTIME даже goTime не определено. Он также должен работать, если я определяю goTime и пуст пустым. Спасение должно дать мне все до времени.

Спасибо

ответ

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(); 
} 
+0

Вы имеете в виду> = начальное время;) – JustLoren

+0

Хорошо, я надеялся, что это можно делать с комплексом, где пункты, но я делаю это так теперь. спасибо. –

+0

но как справиться с этим, если я дам оба параметра? –

2

Попробуйте "взломан", где пункт:

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

Для этого работа, startTime и goTime должны быть Nullable <DateTime> (или DateTime?).

Это будет работать во всех сценариях, то есть когда ...

  1. либо из параметров являются нуль
  2. Оба нулевые
  3. И не нулевой
+0

Это довольно хорошее решение, но это отменяет элемент в результате, если goTime имеет значение null (в базе данных) и передает значение null в параметре goTime (с ненулевым startTime). – daxsorbito

+0

Вы правы. Но поскольку он не упомянул, что поля имеют значение NULL в базе данных, я предположил, что это не так. :) – Yogesh

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

Если я напечатаю только один параметр в веб-сервисе. он выдает неверный аргумент datetime.

+0

Я подозреваю, что ваши строки находятся в неправильном формате, а затем - или, по крайней мере, что разбор не размножается соответствующим образом. Я предлагаю вам разобрать их * до * вы используете их в запросе. –

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; 
    } 
+0

Это не удастся, если оба значения не равны нулю. Он не упомянул, что ему нужны оба параметра в вопросе, но в качестве комментария к ответу Джона. – Yogesh

+0

Вы правы, я пропустил это. Я думаю, вы могли бы сыграть вокруг изменения предложения where, добавив ограничение, если оба значения равны нулю. – daxsorbito

Смежные вопросы