2010-09-30 3 views
1

При запросе коллекции с помощью LINQ всегда возвращает нулевоеПри выполнении запроса коллекции с помощью LINQ всегда возвращает нулевое

Collection<JCTransLabour> oJCTransLabours = null; 

oJCTransLabour = HttpContext.Current.Session["CurrentLabourTransactions"] as 
            Collection<JCTransLabour>; 

// at this point the collection oJCTransLabours contains 3500 records 

var oCurrentLabourTrans = from clt in oJCTransLabours 
          where clt.TransactionDate.Date != DateTime.Now.Date 
          select clt; 

// at this point the collection oJCTransLabour = null 
// I have tried to search on different fields 

return oCurrentLabourTrans; 

Там должно быть что-то я делаю неправильно. Любая помощь будет очень высоко ценится.

+0

После первого шага переменная oJCTransLabour действительно не является нулевой, или это HttpContext.Current.Session ["CurrentLabourTransactions"], которая не является нулевой, поскольку оператор as as C# в C# возвращает null, если тип doesn ' t, в отличие от переменной (Collection), которая дает исключение. –

+0

Как примечание, будьте осторожны с 'DateTime.Now'. Проверьте 'DateTime.UtcNow'. –

ответ

1

Там, по крайней мере, один опечатка в вашем вопросе.
Вы утверждаете, что после того, как

oJCTransLabour = HttpContext.Current.Session["CurrentLabourTransactions"] as Collection<JCTransLabour>; 

oJCTransLabour не равно нулю, верно? Это имеет смысл, если сессия содержит его.

Затем вы определяете и назначаете ему запрос LINQ. И тогда вы говорите, что

// at this point the collection oJCTransLabour = null 

Подождите, как это может быть null? Вы его даже не модифицировали (это было oCurrentLabourTrans изменено), и вы только что сказали oJCTransLabour не имеет значения!

Update: Я просто заметил, что есть ввести имена тоже: вы называете это oJCTransLabours, то вы называете это oJCTransLabour. Пожалуйста, напишите точный код, поэтому мы не делаем предположений о том, что именно вы могли бы омрачить.

И, конечно, выражение LINQ не может быть нулевым. Я думаю, что, скорее всего, oJCTransLabours имеет значение null, хотя вы заявляете иначе.

Причина, по которой вы так думаете, возможно, потому что вы уверены, что HttpContext.Current.Session["CurrentLabourTransactions"] не является нулевым. Это верно, но вы используете оператор as для указания значения Collection<JCTransLabour>. В отличие от оператора литья, as не генерирует исключения, если типы не совпадают, он просто возвращает null.

Вы могли бы хотеть попробовать

oJCTransLabour = (Collection<JCTransLabour>)HttpContext.Current.Session["CurrentLabourTransactions"]; 

и посмотреть, если какие-либо ошибки появляются.

0

Это не похоже на проблему linq, а скорее на то, что значение в сеансе равно null или не Collection<JCTransLabour>.

Вы могли убедиться, что он не является нулевым, изменяя поиск в:

oJCTransLabour = (HttpContext.Current.Session["CurrentLabourTransactions"] as Collection<JCTransLabour>) ?? new Collection<JCTransLabour>(); 

Если всегда должно быть значение сеанса, то вы могли бы бросить исключение, если значение не найдено, прежде чем делать запрос.

0

попробовать это:

var oCurrentLabourTrans = (from clt in oJCTransLabours where clt.TransactionDate.Date != DateTime.Now.Date select clt).ToList(); 
1

Я думаю, вы просто запутанные имена переменных:

// You were missing an 's' before 
oJCTransLabours = HttpContext.Current.Session["CurrentLabourTransactions"] 
            as Collection<JCTransLabour>; 
Смежные вопросы