代码之家  ›  专栏  ›  技术社区  ›  Ryan Alford

C-Linq to SQL-查询问题

  •  0
  • Ryan Alford  · 技术社区  · 15 年前

    我现在非常沮丧。我对Linq to SQL有问题。大约80%的时间,它很好用,我喜欢它。另外20%的时间,L2S创建的查询返回正确的数据,但是当实际从代码中运行它时,它不返回任何数据。我要把头发拔出来了。我希望有人能看到一个问题或者以前听说过这个问题。谷歌搜索并没有返回多少信息。

    这是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 回复  |  直到 15 年前
        1
  •  1
  •   Remus Rusanu    15 年前

    什么是时间卡日期?日期、日期时间、日期时间2、小日期时间、日期时间偏移量还是字符?

    本地日期/时间设置可能会破坏 startDate.ToString(...) ?因为你把@p3作为 一串 , 01/02/2009 可能意味着2月1日 1月2日,取决于服务器上的日期/时间设置。

        2
  •  1
  •   Robert Harvey    15 年前

    我的直觉告诉我你需要退出 DataLayerGlobals.GetInstance().db.MILLERTIMECARDs 变成一个 IQueryable 变量并对其执行LINQ查询,尽管实际上应该没有任何区别(除了更好的可读性之外)。

    您可以检查 可查询的 首先是变量,然后对其运行LINQ查询。

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

        3
  •  1
  •   pFrenchie    15 年前

    我还将了解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)
        };