2009-12-02 5 views
0

Я сейчас полностью расстроен. У меня проблема с LINQ-To-SQL. Около 80% времени он отлично работает, и мне это нравится. Другие 20% времени, запрос, который создает L2S, возвращает правильные данные, но при фактическом запуске его из кода он ничего не возвращает. Я собираюсь вытащить волосы. Я надеюсь, что кто-то может увидеть проблему или слышал об этом раньше. Поиск в Google не возвращает ничего.C# - Linq-To-SQL - Проблема с запросами

Вот запрос LINQ ...

var query = from e in DataLayerGlobals.GetInstance().db.MILLERTIMECARDs 
     where e.deleted_by == -1 
     && e.LNAME == lastName 
     && e.FNAME == firstName 
     && e.TIMECARDDATE == startDate.ToString("MM/dd/yyyy") 
     group e by e.LNAME into g 
     select new EmployeeHours 
     { 
      ContractHours = g.Sum(e => e.HRSCONTRACT), 
      MillerHours = g.Sum(e => e.HRSSHOWRAIN + e.HRSOTHER), 
      TravelHours = g.Sum(e => e.HRSTRAVEL) 
     }; 

Это сгенерированный запрос ....

SELECT SUM([t0].[HRSCONTRACT]) AS [ContractHours], 
     SUM([t0].[HRSSHOWRAIN] + [t0].[HRSOTHER]) AS [MillerHours], 
     SUM([t0].[HRSTRAVEL]) AS [TravelHours] 
FROM [dbo].[MILLERTIMECARD] AS [t0] 
WHERE ([t0].[deleted_by] = @p0) 
    AND ([t0].[LNAME] = @p1) 
    AND ([t0].[FNAME] = @p2) 
    AND ([t0].[TIMECARDDATE] = @p3) 
GROUP BY [t0].[LNAME] 

Теперь, когда я включаю в том же значениях, что запрос LINQ использует в сгенерированный запрос я получаю правильные данные. Когда я запускаю код, я ничего не получаю.

Любые идеи?

ответ

1

Какой тип TIMECARDDATE? Дата, дата-время, дата-время2, smalldatetime, datetimeoffset или символ?

Любые случайные локальные настройки даты и времени испортили сравнение даты startDate.ToString(...)? Поскольку вы отправляете @ p3 как строку , 01/02/2009 может означать 1 февраля или 2 января, в зависимости от установки даты и времени на сервере.

+0

TIMECARDDATE - это строка. Да, да, я знаю. Я унаследовал эту базу данных, и ее изменение не является вариантом. Возможно, это проблема. Он работает, когда дата 10/19/2009, но не работает, когда дата 10/5/2009. Будет ли это проблемой SQL Server или проблемой LINQ? –

+1

@ Eclipsed4utoo Ваш комментарий о неудаче на 10/5/2009 и тот факт, что даты db - это просто строки, заставляет меня думать, что ваша строка формата должна быть «MM/d/yyyy» вместо этого, чтобы вы получили «10/5/2009 «а не« 10/05/2009 », как ваш текущий код. – imaginaryboy

+0

Чувак ... ты такой потрясающий. Вот и все. Я закончил тем, что использовал «M/d/yyyy», поэтому в месяцах не было бы ведущего 0, которое, похоже, также вызывало проблему. –

1

Мой инстинкт говорит мне, что вам нужно вытащить DataLayerGlobals.GetInstance().db.MILLERTIMECARDs в переменную IQueryable и выполнить ваш запрос Linq против этого, хотя на самом деле не должно быть никакой разницы (кроме, возможно, лучшей читаемости).

Сначала вы можете проверить результаты переменной IQueryable, прежде чем запускать запрос Linq.

Чтобы расширить эту концепцию немного дальше, вы можете создать серию переменных IQueryable, каждая из которых хранит результаты запроса Linq с использованием каждого отдельного условия в исходном запросе. Таким образом, вы должны иметь возможность изолировать условие, которое терпит неудачу.

1

Я также хотел бы посмотреть типы данных LNAME & FNAME. Если это NCHAR/NVARCHAR, вам может потребоваться обрезать записи, например.

var query = from e in DataLayerGlobals.GetInstance().db.MILLERTIMECARDs 
    where e.deleted_by == -1 
    && e.LNAME.Trim() == lastName 
    && e.FNAME.Trim() == firstName 
    && e.TIMECARDDATE == startDate.ToString("MM/dd/yyyy") 
    group e by e.LNAME into g 
    select new EmployeeHours 
    { 
     ContractHours = g.Sum(e => e.HRSCONTRACT), 
     MillerHours = g.Sum(e => e.HRSSHOWRAIN + e.HRSOTHER), 
     TravelHours = g.Sum(e => e.HRSTRAVEL) 
    }; 
Смежные вопросы