2015-04-16 2 views
1

Привет У меня есть таблица, где есть свойство RespondB, которое имеет DateTime и является Nullable. Вот LINQ Я пытаюсь запустить над EF6:Nullable DateTime in Where Where in EF Linq Query

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. Как бы один запрос к базе данных с помощью LINQ, если вы хотите, чтобы проверить нулевые столбцы DateTime?

спасибо.

EDIT:

SQL, который продуцируется EF при испытании в MSSMS возвращает желаемый результат FYI. SQL Произведено:

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() на сборе.

+0

https://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx –

+0

Спасибо. Я как бы понимаю, почему происходит ошибка, я просто не знаю лучшей практики для достижения того, что я пытаюсь сделать. – paulpitchford

+0

Попробуйте следующее: 'var ASAPEnquiries = db.Enquiries .Where (enq =>! Enq.RespondB.HasValue) .OrderBy (enq => enq.FlReference) .ToList();' просто для отслеживания ошибки. Сообщите нам, если вы получите какие-либо ошибки при переходе по этой линии. –

ответ

0

Казалось бы, у меня есть egg on my face. если заявление звала пустоту, где я был тогда с помощью item.RespondBy.Value.ToShortDateTime(). Как беспокойно. Спасибо всем за вашу помощь, хотя, я ценю ваше время.

1

Используйте свойство HasValue, чтобы проверить, имеет ли значение Nullable значение.

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

Я пробовал IEnumerable ASAPEnquiries = db.Enquiries.Where (enq => enq.RespondBy.HasValue == false && enq.JobCostings.Count == 0) .OrderBy (enq => enq.FluidReference); уже, и я получаю тот же результат, что и он. – paulpitchford

+0

@paulpitchford, '== false' не нужно! –

+0

Не так ли? Эффективно мне нужны записи, в которых RespondBy не имеет значения. я бы использовал '! enq.RespondB.HasValue'? <- Это делает то же самое, что и выше. – paulpitchford

0

Пожалуйста, убедитесь, что ваш Enquiry класса значение правопреемника к JobCostings собственности в его конструктора например

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

и попробовать это один:

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