2016-02-08 3 views
0

У меня возникла проблема с подзапросом linq возвращать недопустимые данные при добавлении в проверки даты и времени как часть предложения where.Entity Framework DateTIme Query

Это исходный запрос, и он возвращает 0; потому что набор результатов null

var subquery = 
    (from item in g 
    from e in item.Entry 
    where e.Type == 1 
     && e.EntryType == 2 
     && item.StartDate >= priorMonthStartOfDay 
     && item.EndDate <= startOfDayQueryParam 
    select e.Amount).Sum() ?? 0M; 

Я изменил запрос, чтобы увидеть то, что было данных; вот этот запрос и результирующий набор данных.

var subquery = 
    (from item in g 
    from e in item.Entry 
    where e.Type == 1 
     && e.EntryType == 2 
    select new 
      { 
       Amount = e.Amount, 
       SD = item.StartDate, 
       ED = item.EndDate, 
       QD = priorMonthStartOfDay 
      }; 

no date restriction results

Затем я добавил в сравнение даты начала и результаты приведены ниже. priorMonthStartOfDay является DateTime со значением 12/1/2015 12:00:00 AM

var subquery = 
    (from item in g 
    from e in item.Entry 
    where e.Type == 1 
     && e.EntryType == 2 
     && item.StartDate >= priorMonthStartOfDay 
    select new 
      { 
       Amount = e.Amount, 
       SD = item.StartDate, 
       ED = item.EndDate, 
       QD = priorMonthStartOfDay 
      }; 

start date restriction

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

+0

то, что тип данных 'priorMonthStartOfDay' в последнем запросе? Является ли это 'string' или' DateTime'? – gldraphael

+0

@gldraphael DateTime; обновленный вопрос – drneel

+0

Можете ли вы показать, как вы устанавливаете 'priorMonthStartOfDay'? Возможно, это не совсем то, что вы видите в отладчике. –

ответ

0

Единственным логическим объяснением может быть то, что переменные priorMonthStartOfDay и/или startOfDayQueryParam содержат временную часть, не показанную в отладчике. Обратите внимание, что по умолчанию миллисекунды часть не отображается, не говоря уже о тиках.

Чтобы быть 100% уверены, что вы сравниваете против даты, изменить дату часть критериев

&& item.StartDate >= priorMonthStartOfDay.Date 
&& item.EndDate <= startOfDayQueryParam.Date 
+0

Это были тики. Они были на 1; Я проверил миллисекунды, и я даже посмотрел на клещи, но, по-видимому, недостаточно близко. – drneel