Linq通过可为空的datetime分组并将其用作标准

时间:2009-11-17 19:15:38

标签: vb.net linq subsonic3 group-by nullable

我正在使用SubSonic3,Linq,MS SQL Server 2005的ASP.NET应用程序中的可空日期时间列[DateInsp]进行挣扎。

当datetime列[DateInsp]不允许空值时,我将这一切都工作了。一个新的要求迫使我设置[DateInsp]列以允许空值,现在我正在努力让这个功能再次正常工作。

问题1: 我需要首先呈现给定检查员最近7个检查日期的下拉列表(这是检查员最近7个日期的分组列表)。以下是我需要转换为Linq语法的TSQL:

declare @InspectorID varchar(5)
set @InspectorID = 'GPA'

select top 7 convert(nvarchar(30), [DateInsp], 101) InspectedDate
from [dbo].[IncomingInspection]
group by [InspectorID], convert(nvarchar(30), [DateInsp], 101)
having [InspectorID] = @InspectorID
order by convert(nvarchar(30), [DateInsp], 101) desc

如果我无法使用Linq正常工作,但我可以/可以构建一个存储过程来返回日期列表并将其放入下拉列表中。很公平。我一直在与Linq语法作斗争,所以非常感谢这方面的任何帮助。

问题2:我需要使用上面提到的下拉列表中的所选日期来为此检查员和正确的日期提取正确的记录。同样,这是一个可以为空的日期时间字段,这对我来说是一个真正的难点。

以下是在我必须更改datetime字段以允许Null之前完成该要求的原始Linq语法:

    Dim query = (From i In db.IncomingInspections _
        Where i.InspectorID = User.Identity.Name _
        Group By Key = New With {i.DateInsp} Into Group _
        Order By Key.DateInsp Descending _
        Select Key = New With {.DateInsp = Key.DateInsp.ToShortDateString}).Take(7)

这个应用程序是用VB.NET编写的,并使用了一些Linq语法,这些都让我头疼。如果你能提供C#语法来完成这个,我可以自己将它翻译成VB.NET。

修改

由于某种原因,我无法使用.Value属性;我得到:不支持会员'价值'

我得到:“'<'附近的语法不正确。”如果我尝试将日期比较添加到where子句中。

结束编辑

非常感谢,

约什

2 个答案:

答案 0 :(得分:1)

我继续使用2个存储过程来解决这个问题,从而消除了对Linq语法的需求:

以下是我用来获取最近7个检验日期列表的TSQL(只有日期时间字段的日期部分:

select top 7 convert(nvarchar(30), [DateInsp], 101) InspectedDate
from [dbo].[IncomingInspection]
group by [InspectorID], convert(nvarchar(30), [DateInsp], 101)
having [InspectorID] = @InspectorID
order by convert(nvarchar(30), [DateInsp], 101) desc

以下是我用来获取检查员的检查记录的过滤列表以及在下拉列表中选择的检查日期的tsql(仅使用条件声明中的日期部分):

select [ID]
,[InspectorID]
,[DateInsp]
-- (more fields here)
from [dbo].[IncomingInspection]
where [InspectorID] = @InspectorID and DATEADD(dd, 0, DATEDIFF(dd, 0, [DateInsp])) = DATEADD(dd, 0, DATEDIFF(dd, 0, @DateFilter))

有时我只需要使用作品而不是新的和有光泽的作品。我偶尔也会遇到Linq中最简单的事情,我认为这是因为Linq对我来说是新手,我在VB.NET语法上打败了我的头脑,特别是当它与Linq结合时。

答案 1 :(得分:0)

很抱歉在C#中回答,但这是我对您的疑问的解释:

问题#1。

您在问题中使用 ,并将日期时间转换为字符串。我没有看到任何这些操作的需要。

string inspectorId = "GPA";

List<DateTime?> someDates = db.IncomingInspection
  .Where(insp => insp.InspectorId == inspectorId)
  .Select(insp => insp.InspectedDate)
  .Distinct()
  .OrderByDescending(d => d)
  .Take(7)
  .ToList();

问题#2。

有两种情况:要么是用户有空,要么是有值。编写查询以定位每个案例很简单。这么简单,我觉得我在这里误解了这个意图。

DateTime? selectedDate = control.SelectedValue;

List<IncomingInspection> someRecords = null;

if (selectedDate.HasValue())
{
  DateTime selectedDateValue = selectedDate.Value;
  someRecords = db.IncomingInspection
    .Where(insp => insp.InspectorId == inspectorId)
    .Where(insp => insp.InspectedDate == selectedDateValue)
    .ToList();
}
else
{
  someRecords = db.IncomingInspection
    .Where(insp => insp.InspectorId == inspectorId)
    .Where(insp => insp.InspectedDate == null)
    .ToList();
}