2012-09-25 2 views
1

У меня есть проблемы с LINQ (с использованием EF - 4.3.1.0) с помощью следующего:Linq, используя обнуляемое DATETIME поля

DateTime? dtcollected = DateTime.TryParse(dateCollected, out dateVal) ? dateVal : (DateTime?)null; 
    DateTime? dtanalyzed = DateTime.TryParse(dateanalyzed, out dateVal) ? dateVal : (DateTime?)null; 


    var doesexist = (from pw in dbContext.WtTbl          
         where pw.CompanyId == 13 
         && pw.DateCollected == dtcollected 
         && pw.DateAnalyzed == dtanalyzed          
         select pw).Any(); 

Обратите внимание, что dateCollected пришел в виде строки, так что я должен был преобразовать его в обнуляемом DateTime. То же самое касается даты датирования.

На что я нахожусь, это то, что у меня есть компания с номером 13. Нулевое значение dtcollected. И значение для dtanalyzed уже в таблице, поэтому я ожидаю, что hasexist вернет true, но возвращает false.

Если я закомментировать

 var doesexist = (from pw in dbContext.WtTbl          
         where pw.CompanyId == 13 
        // && pw.DateCollected == dtcollected 
         && pw.DateAnalyzed == dtanalyzed          
         select pw).Any(); 

или поставить:

 var doesexist = (from pw in dbContext.WtTbl          
         where pw.CompanyId == 13 
         && pw.DateCollected == null 
         && pw.DateAnalyzed == dtanalyzed          
         select pw).Any(); 

Тогда я получаю истинное. Почему он не может понять значение null dtcollected? Я делаю что-то неправильно.

+2

LINQ to what? Это похоже на ошибку EF, которая была исправлена ​​в 4.5 – SLaks

+0

Да, pwDateCollected имеет значение null в таблице, а dtcollected имеет значение null в C# для этой конкретной записи. –

+0

Yep, EF не может обрабатывать запрос, где == , где оба значения NULL. Это должно быть переведено в IS NULL, но оно соответствует = NULL, который не дает правильного результата. – Maarten

ответ

1

В большинстве систем баз данных (определенно SQL Server), если одна сторона сравнения равна нулю, то результат сравнения неизвестен и, следовательно, не включен в набор результатов (или, для всех целей и целей, false).

Тем не менее, вы должны выполнить проверку на нуль против ваших переменных, только проверка на поле базы данных, если параметр не равен нулю, например, так:

var doesexist = (
    from pw in dbContext.WtTbl          
    where 
     pw.CompanyId == 13 && 
     (dtcollected == null || pw.DateCollected == dtcollected) && 
     (dtanalyzed == null || pw.DateAnalyzed == dtanalyzed) 
    select pw).Any(); 

Это переводится примерно на:

declare @dtcollected date = null 
declare @dtanalyzed date = null 

select 
    * 
from 
    Table as t 
where 
    (@dtcollected is null or t.DateCollected = @dtcollected) and 
    (@dtanalyzed is null or t.DateAnalyzed = @dtanalyzed) 
Смежные вопросы