C # - Linq-To-SQL - проблема с запросами - PullRequest
0 голосов
/ 02 декабря 2009

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

Вот запрос 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, в сгенерированный запрос, я получаю правильные данные. Когда я запускаю код, я ничего не получаю.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 02 декабря 2009

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

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

1 голос
/ 02 декабря 2009

Я бы также взглянул на типы данных 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)
    };
1 голос
/ 02 декабря 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...