Ваша проблема в том, что ваш DefaultIfEmpty выполняется как AsQueryable.Выполните его AsEnumerable
, и оно будет работать:
// create the default element only once!
static readonly ClinicalAssPatInVcm defaultElement = new ClinicalAssPatInVcm ();
var result = <my big linq query>
.Where(x => x.ClinicalAssetID == id)
.AsEnumerable()
.DefaultIfEmpty(defaultElement)
.FirstOrDefault();
Это не приведет к снижению производительности!
Системы управления базами данных чрезвычайно оптимизированы для выбора данных,Одна из более медленных частей запроса к базе данных - это транспортировка выбранных данных в локальный процесс.Следовательно, разумно позволить СУБД делать большую часть выбора, и только после того, как вы узнаете, что у вас есть только те данные, которые вы действительно планируете использовать, перенесите данные в локальный процесс.
В вашем случае,вам нужен, по крайней мере, один элемент из вашей СУБД, и если ничего нет, вы хотите использовать вместо него объект по умолчанию.
AsQueryable
будет разумно перемещать выбранные данные в локальный процесс, вероятно, за«страница» выбранных данных.
Размер страницы - хороший компромисс: не слишком маленький, поэтому вам не нужно слишком часто просить следующую страницу;не слишком большой, так что вы не переносите гораздо больше предметов, чем фактически используете.
Кроме того, из-за оператора Where
вы все равно ожидаете не более одного элемента.Так что полная выборка «страницы» не представляет проблем, страница будет содержать только один элемент.
После того, как страница выбрана, DefaultIfEmpty
проверяет, пуста ли страница, и, если да, возвращает последовательностьсодержащий defaultElement
.Если нет, возвращается полная страница.
После DefaultIfEmpty вы берете только первый элемент, который вам нужен.