Вызов fishcakes.DefaultIfEmpty()
может вернуть коллекцию с null
.
Если вы вызываете .ToList()
, все текущие результаты копируются в локальные (.Net) объекты, и все команды после .ToList()
будут выполняться в вашей программе.
Если вы выполняете запрос к коллекциям .Net, то пытаетесь вызвать null.ranking
- что выдает NullReferenceException
. В то же время выполнение на SQL Server не вызывает исключений, потому что в SQL можно запросить свойство $ 1011 * (оно просто вернет null
).
Для предотвращения исключений в вашем примере: вы можете либо отфильтровать элементы, у которых ranking
равно null
, либо заменить
orderby b.ranking
примерно так (я полагаю, ranking
- это int)
orderby b != null ? b.ranking : -1
Та же ситуация с материализацией ценностей. Например (предположим, что Item
может иметь Category
или может не иметь):
// this will work, because it's executed on SQL-side
db.Items
.Select(x=>new { CatId = (int?)x.Category.Id, x.Id})
.ToList();
// this will throw NullRefException, because it's executed against collection in .Net environment, not on SQL Server.
db.Items
.ToList()
.Select(x=>new { CatId = (int?)x.Category.Id, x.Id});
PS: Если вы используете Resharper, то в первом примере будет жаловаться, что приведение к int?
не нужно. Не верь этому! )