2009-12-02 57 views
0

我现在彻底沮丧。我遇到了LINQ-To-SQL的问题。大约80%的时间,它工作的很好,我喜欢它。另外20%的时间,L2S创建的查询返回正确的数据,但实际从代码运行时,它不会返回任何内容。我即将把我的头发拉出来。我希望有人能看到一个问题或以前听说过这个。谷歌搜索没有什么回报。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?日期,日期时间,datetime2,smalldatetime,datetimeoffset或字符?

任何机会的本地日期/时间设置搞乱startDate.ToString(...)的日期比较?由于您要发送@ p3作为字符串,01/02/2009可能意味着2月1日 1月2日,具体取决于服务器上的日期/时间设置。

+0

TIMECARDDATE是一个字符串。是的,是的,我知道。我继承了这个数据库,并且改变它不是一个选项。 这可能是问题。它在日期为2009年10月19日时有效,但在日期为2009年5月10日时不起作用。这是SQL Server问题还是LINQ问题? – 2009-12-02 03:12:28

+1

@ Eclipsed4utoo你对10/5/2009的失败以及db日期只是字符串的事实的评论让我认为你的格式字符串应该是“MM/d/yyyy”,而不是你的“10/5/2009 “而不是”10/05/2009“作为你当前的代码。 – imaginaryboy 2009-12-02 03:31:49

+0

老兄......你太棒了。就是这样。我结束了使用“M/D/YYYY”,所以月份不会有领先的0,这似乎也导致了这个问题。 – 2009-12-02 03:49:23

1

我的直觉告诉我,你需要将DataLayerGlobals.GetInstance().db.MILLERTIMECARDs变成IQueryable变量,然后执行你的Linq查询,尽管实际上应该没有什么区别(除了可读性更好之外)。

在运行Linq查询之前,您可以先检查IQueryable变量的结果。

为了进一步扩展这个概念,您可以创建一系列IQueryable变量,每个变量都存储使用原始查询中每个单独条件的Linq查询的结果。这样,你应该能够隔离失败的情况。

1

我还会看看FNAME数据类型的LNAME &。如果它们是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) 
    };