EF Linq查询中Where子句中的Nullable DateTime

时间:2015-04-16 20:25:04

标签: linq entity-framework

嗨我有一个表格,其中有一个具有DateTime且为Nullable的RespondBy属性。这是我试图在EF6上运行的linq:

IEnumerable<Enquiry> ASAPEnquiries = db.Enquiries
       .Where(enq => enq.RespondBy == null && enq.JobCostings.Count == 0)
       .OrderBy(enq => enq.FlReference);

但是,当我运行if (ASAPEnquiries.Count() > 0)时,我收到一条错误,指出Nullable object must have a value.如果要检查null DateTime列,如何使用linq查询数据库?

谢谢。

修改

在MSSMS中测试时由EF生成的SQL会返回所需的结果FYI。 SQL Produced:

SELECT 
    [Project1].[Id] AS [Id], 
    [Project1].[FlReference] AS [FlReference], 
    [Project1].[EnquiryDate] AS [EnquiryDate], 
    [Project1].[ContactName] AS [ContactName], 
    [Project1].[ProjectReference] AS [ProjectReference], 
    [Project1].[EnquiryDetails] AS [EnquiryDetails], 
    [Project1].[RespondBy] AS [RespondBy], 
    [Project1].[CreatedBy] AS [CreatedBy], 
    [Project1].[Created] AS [Created], 
    [Project1].[ModifiedBy] AS [ModifiedBy], 
    [Project1].[Modified] AS [Modified], 
    [Project1].[RowVersion] AS [RowVersion], 
    [Project1].[Enquiry_Customer] AS [Enquiry_Customer], 
    [Project1].[Enquiry_EnquiryStatus] AS [Enquiry_EnquiryStatus]
    FROM ( SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[FlReference] AS [FlReference], 
        [Extent1].[EnquiryDate] AS [EnquiryDate], 
        [Extent1].[ContactName] AS [ContactName], 
        [Extent1].[ProjectReference] AS [ProjectReference], 
        [Extent1].[EnquiryDetails] AS [EnquiryDetails], 
        [Extent1].[RespondBy] AS [RespondBy], 
        [Extent1].[CreatedBy] AS [CreatedBy], 
        [Extent1].[Created] AS [Created], 
        [Extent1].[ModifiedBy] AS [ModifiedBy], 
        [Extent1].[Modified] AS [Modified], 
        [Extent1].[RowVersion] AS [RowVersion], 
        [Extent1].[Enquiry_Customer] AS [Enquiry_Customer], 
        [Extent1].[Enquiry_EnquiryStatus] AS [Enquiry_EnquiryStatus], 
        (SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[JobCostings] AS [Extent2]
            WHERE [Extent1].[Id] = [Extent2].[JobCosting_Enquiry]) AS [C1]
        FROM [dbo].[Enquiries] AS [Extent1]
    )  AS [Project1]
    WHERE ([Project1].[RespondBy] IS NULL) AND (0 = [Project1].[C1])
    ORDER BY [Project1].[FluidReference] ASC

另外,如果我遍历集合,我没有得到任何错误,所以它似乎与在集合上调用.Count()有关。

3 个答案:

答案 0 :(得分:1)

使用HasValue属性检查Nullable是否具有值。

IEnumerable<Enquiry> ASAPEnquiries = db.Enquiries
       .Where(enq => enq.RespondBy.HasValue && enq.JobCostings.Count == 0)
       .OrderBy(enq => enq.FlReference);

答案 1 :(得分:0)

请确保您的Enquiry类为其中JobCostings属性的构造函数赋值 e.g。

public Enquiry()
{
    this.JobCostings = new HashSet<JobCosting>();
    //.......
}

试试这个:

IEnumerable<Enquiry> ASAPEnquiries = db.Enquiries
       .Where(enq => enq.RespondBy == null && !enq.JobCostings.Any())
       .OrderBy(enq => enq.FlReference);

答案 2 :(得分:0)

看起来我有egg on my face. if语句调用了一个空格,然后我使用item.RespondBy.Value.ToShortDateTime()。多么尴尬。谢谢大家的帮助,感谢您的光临。